Die Kombination von Listen in Lambda / LINQ
Frage
Wenn ich Variable vom Typ IEnumerable<List<string>>
haben, ist es eine LINQ-Anweisung oder Lambda-Ausdruck, den ich für sie gelten können, die die Listen der Rückkehr eine IEnumerable<string>
kombinieren?
Lösung
Select - d. H
IEnumerable<List<string>> someList = ...;
IEnumerable<string> all = someList.SelectMany(x => x);
Für jedes Element in someList, das verwendet dann das Lambda "x => x" eine IEnumerable zu bekommen
Diese werden dann als zusammenhängender Block zurückgegeben. Im Wesentlichen Select ist so etwas wie (vereinfacht):
static IEnumerable<TResult> SelectMany<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, IEnumerable<TResult>> selector) {
foreach(TSource item in source) {
foreach(TResult result in selector(item)) {
yield return result;
}
}
}
Obwohl das vereinfacht etwas.
Andere Tipps
Wie wäre es
myStrings.SelectMany(x => x)
Nicht gerade ein einzelner Methodenaufruf, aber man sollte schreiben können
var concatenated = from list in lists from item in list select item;
Wo 'Listen' ist Ihre IEnumerable<List<string>>
und verketteten ist vom Typ IEnumerable<string>
.
(Technisch this ist ein einzelner Methodenaufruf SelectMany
-. Es sieht einfach nicht wie es war ich von der Öffnung Aussage gemeint Ich wollte nur, dass klären, in jedem Fall hätte verwirrt oder kommentiert - ich erkennen, nachdem ich gebucht hatte, wie es) gelesen hat, könnte
Erstellen 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;
}
}
Mit LINQ Ausdruck ...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
... funktioniert gut. : -)
b
wird ein IEnumerable<string>
und a
wird ein string
sein.
Hier ist eine andere LINQ-Abfrage Verständnis.
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;