Wie füge ich eine Liste von Listen mit demselben Elementtyp zu einer einzelnen Liste von Elementen zusammen?


209

Die Frage ist verwirrend, aber viel klarer, wie in den folgenden Codes beschrieben:

   List<List<T>> listOfList;
   // add three lists of List<T> to listOfList, for example
   /* listOfList = new {
        { 1, 2, 3}, // list 1 of 1, 3, and 3
        { 4, 5, 6}, // list 2
        { 7, 8, 9}  // list 3
        };
   */
   List<T> list = null;
   // how to merger all the items in listOfList to list?
   // { 1, 2, 3, 4, 5, 6, 7, 8, 9 } // one list
   // list = ???

Sie sind sich nicht sicher, ob dies mit C # LINQ oder Lambda möglich ist?

Wie kann ich eine Liste von Listen im Wesentlichen verketten oder " reduzieren "?

Antworten:


455

Verwenden Sie die SelectMany-Erweiterungsmethode

list = listOfList.SelectMany(x => x).ToList();

73
Ich frage mich, wie viele Leute ihre eigene "Flatten" -Erweiterung geschrieben haben, ohne zu wissen, wie SelectMany funktioniert.
James Schek

1
Warum wird x => x benötigt, damit dies funktioniert? Normalerweise sehe ich Dinge wie x => x +1, aber nicht x => x.
SwimBikeRun

9
@SwimBikeRun SelectMany wird verwendet, um eine IEnumerable von TSources zu nehmen, jede TSource in der Liste in eine IEnumerable von TResults zu konvertieren und dann alle diese IEnumerables zu einer großen zu verketten. In diesem Fall müssen Sie eine Liste mit Listen starten. Wenn Sie diese also verketten möchten, ist die Funktion zum Zuordnen von einer TS-Quelle (die eine IE-Zahl von TResults ist) zu einer IE-Zahl von TR-Ergebnissen die Identitätsfunktion (x => x). Dies ist wirklich nur ein Sonderfall, in dem Sie nicht den zusätzlichen Schritt benötigen, jede TSource in eine Liste umzuwandeln, da es sich bereits um eine Liste handelt.
Sean

@JaredPar können wir diese Logik auf Liste <Liste <Liste <T> >> anwenden?
Tk1993

4
@ TusharKukreti Sicher, nur verwendenlist.SelectMany(x => x.SelectMany(y => y)).ToList();
Brandon Kramer

13

Hier ist die in C # integrierte Syntaxversion:

var items =
    from list in listOfList
    from item in list
    select item;

Ein bisschen verwirrend, aber nett. Wie das? var items = from item in (von list in listOflist select list) select item
David.Chu.ca

4
Das 'double from' ist dasselbe wie SelectMany ... SelectMany ist wahrscheinlich die leistungsstärkste der LINQ-Methoden (oder Abfrageoperatoren). Um zu sehen, warum, Google "LINQ SelectMany Monad" und Sie werden mehr entdecken, als Sie darüber wissen möchten.
Richard Anthony Hein

3
Geben Sie beim Googeln von "LINQ SelectMany Monad" keine Anführungszeichen an, da Sie sonst nur hierher zurückkehren.
Oxin

12

Meinst du das?

var listOfList = new List<List<int>>() {
    new List<int>() { 1, 2 },
    new List<int>() { 3, 4 },
    new List<int>() { 5, 6 }
};
var list = new List<int> { 9, 9, 9 };
var result = list.Concat(listOfList.SelectMany(x => x));

foreach (var x in result) Console.WriteLine(x);

Ergebnisse in: 9 9 9 1 2 3 4 5 6


Oder Sie können list.AddRange () anstelle von Concat () verwenden, um die zusammengeführten Elemente zur vorhandenen Liste hinzuzufügen.
Dahlbyk

1

List<List<List<x>>>Verwenden Sie für und so weiter

list.SelectMany(x => x.SelectMany(y => y)).ToList();

Dies wurde in einem Kommentar gepostet, verdient aber meiner Meinung nach eine gesonderte Antwort.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.