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?

War es hilfreich?

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 für die inneren Elemente. In diesem Fall wird jedes "x" ist eine List , die bereits IEnumerable .

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top