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

Cédric Boivin
quelle

Antworten:

567

Versuchen SelectMany()

var result = iList.SelectMany( i => i );
Mike Zwei
quelle
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;
rekursiv
quelle
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()
Dylan Beattie
quelle
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);
mqp
quelle
11

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

List<int> flatList= k.SelectMany( v => v).ToList();
Daniel
quelle