2009-02-08 22 views
19

Gibt es einen einfachen eingebauten Weg, um eine geordnete Liste von IEnumerable s zu nehmen und eine einzige IEnumerable zurückgeben, die in der Reihenfolge alle Elemente in der ersten, dann die zweite und so weiter ergibt.IEnumerables in C# verketten?

Ich könnte sicherlich meine eigene schreiben, aber ich wollte wissen, ob es schon einen Weg gab, diese scheinbar nützliche Aufgabe zu erledigen, bevor ich es tue.

Antwort

24

Versuchen Sie SelectMany.

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

Der Zweck dieser Funktion ist es, eine Gruppe von IEnumerable < IEnumerable <T> > in eine IEnumerable <T> abzuflachen. Die zurückgegebenen Daten behalten die ursprüngliche Reihenfolge bei.

15

Zusätzlich zu JaredPar des (richtigen) Antwort - auch Abfragesyntax:

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

Im Anschluss an die (richtigen) LINQ-basierten Antworten ...

Wenn Sie nicht wollen, LINQ verwenden, Sie können eine ChainedEnumerable Klasse, mit Ertrag erfinden:

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(); 
    } 
} 

es wie folgt verwendet:

List<string> a = new List<string> { "A1", "A2", "A3" }; 
List<string> b = new List<string> { "B1", "B2", "B3" }; 
ChainedEnumerable<string> chainedEnumerable = 
    new ChainedEnumerable<string>(a, b); 
foreach (string s in chainedEnumerable) 
    Console.WriteLine(s); 
+0

+1 Dies ist eine schöne und saubere Lösung. Ich glaube, ich werde es in meine Sachen einbauen! –