Liste in LINQ reduzieren


313

Ich habe eine LINQ-Abfrage, die zurückgegeben wird, IEnumerable<List<int>>aber ich möchte nur zurückgeben, List<int>damit ich meinen gesamten Datensatz in meinem IEnumerable<List<int>>Array zu nur einem Array zusammenführen möchte .

Beispiel:

IEnumerable<List<int>> iList = from number in
    (from no in Method() select no) select number;

Ich möchte mein gesamtes Ergebnis IEnumerable<List<int>>auf nur eines bringenList<int>

Daher aus Quell-Arrays: [1,2,3,4] und [5,6,7]

Ich möchte nur ein Array [1,2,3,4,5,6,7]

Vielen Dank

Antworten:


567

Versuchen SelectMany()

var result = iList.SelectMany( i => i );

8
Danke, ich vergesse dieses immer - ich weiß, dass es da ist, aber ich verbringe einfach viel zu viel Zeit damit, jedes Mal zu googeln, wenn ich es benutzen muss. Diese Antwort mit einem Lesezeichen versehen. :-)
BrainSlugs83

Für eine Weile hatte ich Angst, dass ich der einzige war, der das jemals brauchte. Danke Mike!
Arnab Chakraborty

7
Gibt es eine alternative Syntax für SelectMany( i => i )? Ich habe gesehen, dass diese Syntax häufig verwendet wird, aber es scheint eine entartete Verwendung der Auswahlfunktion zu sein. Daher hätte ich erwartet, dass die Sprachdesigner eine Verknüpfungssyntax speziell für Listen von Listen entwickeln
Andy

86

Mit Abfragesyntax:

var values =
from inner in outer
from value in inner
select value;

Dank der genauen Syntax, nach der ich gesucht habe, und so vielen SO-Antworten wird etwas anderes ausführlicher aufgeführt.
SilverSideDown

Das ist viel, viel besser als SelectMany. Klarer genau, was los ist IMO, danke für den Hinweis!
Bryan Rayner

3
Persönlich finde ich die Version der Abfragesyntax immer viel weniger intuitiv als die Methode, die die Version aufruft. Wenn Resharper anbietet, Schleifen in LINQ-Ausdrücke zu konvertieren, wenn es mir die Abfragesyntax gibt, werde ich immer rückgängig machen.
Bikeman868

23
iList.SelectMany(x => x).ToArray()

6
@recursive Was haben alle anderen vermisst? .ToArray()? - Das ist ein Umstand - wenn Sie nur einmal iterieren müssen - oder wenn sich die Elemente wahrscheinlich ändern, dann .ToArray()ist dies definitiv nicht das, was Sie wollen. Aber mit statischen Elementen, die Sie mehrmals aufzählen werden .ToList()oder .ToArray()die eine Leistungsverbesserung bewirken (auf Kosten einer etwas höheren Speichernutzung, was normalerweise ein ziemlich gutes Geschäft ist).
BrainSlugs83

2
Vermutlich erfordern die Umstände in diesem Fall Arrays, da dies in der Frage angegeben wurde.
rekursiv

8
@recursive, wenn wir nicht auswählen, sagt das OP, dass er zurückkehren muss List<int>, also .ToList()wäre es die richtige Wahl.
MEMark

@MEMark OP sagt auch "nur zu einem Array"
StefanJanssen

12

So was?

var iList = Method().SelectMany(n => n);

11

Wenn Sie eine haben List<List<int>> k, können Sie tun

List<int> flatList= k.SelectMany( v => v).ToList();
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.