2009-02-08 16 views
19

IEnumerable s numaralı bir listeyi almanın ve IEnumerable numaralı tek bir öğeyi döndürmenin basit bir yerleşik yolu var mıdır, bu da sırasıyla ilk, daha sonra ikinci ve daha sonra tüm öğeleri verir.C# IEnumerables zincirleme?

Kesinlikle kendim yazabilirim, ama bunu yapmadan önce bu görünüşte faydalı görevi gerçekleştirmenin bir yolu olup olmadığını bilmek istedim.

cevap

24

ChooseMany.

IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){ 
return e.SelectMany(x => x); 
} 

Bu fonksiyon, IEnumerable <T> içine IEnumerable < IEnumerable <T> > bir grup düzleştirmek için. Döndürülen veriler orijinal siparişi koruyacaktır. - JaredPar en (doğru) cevabı Daha

15

da sözdizimi sorgulamak: (doğru) LINQ tabanlı cevaplara Dahası

var all = from inner in outer 
      from item in inner 
      select item; 
12

...

LINQ kullanmak istemiyorsanız,

public class ChainedEnumerable<T> : IEnumerable<T> 
{ 
    private readonly IEnumerable<T>[] _inners; 

    public ChainedEnumerable(params IEnumerable<T>[] inners) 
    { 
     _inners = inners; 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach (IEnumerable<T> inner in _inners) 
     { 
      foreach (T t in inner) 
      { 
       yield return t; 
      } 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

böyle kullanın:

Eğer verim kullanarak, bir ChainedEnumerable sınıf icat edebilirsiniz 210
+0

+1 Bu güzel ve düzenli bir çözümdür. İnanıyorum ki, eşyalarıma dahil edeceğim! –