2008-09-29 5 views
15

Wenn ich eine Variable vom Typ IEnumerable<List<string>> habe, gibt es eine LINQ-Anweisung oder einen Lambda-Ausdruck, der die Listen zusammenfasst, die eine IEnumerable<string> zurückgeben?Kombinieren von Listen in Lambda/LINQ

Antwort

31

Select - das heißt

 IEnumerable<List<string>> someList = ...; 
     IEnumerable<string> all = someList.SelectMany(x => x); 

Für jedes Element in someList, das verwendet dann das Lambda "x => x", um einen IEnumerable <T> für die inneren Elemente. In diesem Fall ist jedes "x" eine Liste <T>, die bereits IEnumerable <T> ist.

Diese werden dann als zusammenhängender Block zurückgegeben. Im Wesentlichen ist SelectMany etwas wie (vereinfacht):

Obwohl das etwas vereinfacht ist.

2

Nicht gerade ein einzelner Methodenaufruf, aber Sie sollten

var concatenated = from list in lists from item in list select item; 

Wo ‚Listen‘ schreiben können ist Ihr IEnumerable<List<string>> und verketteten vom Typ IEnumerable<string>.

(Technisch diese ist ein einzelner Methodenaufruf SelectMany -. Es sieht einfach nicht wie es war ich von der Öffnung Aussage gemeint Ich wollte nur, dass bis löschen, falls jemand hätte verwirrt oder kommentiert - ich erkennen, nachdem ich gepostet hatte, wie es gelesen haben könnte).

0

Machen Sie eine einfache Methode. Keine Notwendigkeit für LINQ:

IEnumerable<string> GetStrings(IEnumerable<List<string>> lists) 
{ 
    foreach (List<string> list in lists) 
    foreach (string item in list) 
    { 
    yield return item; 
    } 
} 
+0

Und keinen Grund, es nicht zu benutzen, wenn Sie 3.5 verwenden .NET (die wir aus dem OP annehmen kann) oder C# 3.0 mit .NET 2.0 und LinqBridge. –

+0

@Marc: Du hast recht, besonders wenn es einen einfachen "linqish" Weg gibt. Manchmal versuchen die Leute einfach etwas auf LINQ-Art zu tun und machen einfache Dinge schwerer zu verstehen. – VVS

0

Mit LINQ Ausdruck ...

IEnumerable<string> myList = from a in (from b in myBigList 
             select b) 
          select a; 

... funktioniert gut. :-)

b wird ein IEnumerable<string> sein und a wird ein string sein.

0

Hier ist ein weiteres LINQ-Abfrageverständnis.

IEnumerable<string> myStrings = 
    from a in mySource 
    from b in a 
    select b; 
7

Wie wäre es

myStrings.SelectMany(x => x) 
+0

gute Lösung, mit kleinem Tippfehler –

+0

Danke. Aktualisiert den Tippfehler – JaredPar