419 Stimmen

Flachere Liste in LINQ

Ich habe eine LINQ-Abfrage, die zurückgibt IEnumerable<List<int>> aber ich möchte nur zurückkehren List<int> Ich möchte also alle meine Datensätze in meinem System zusammenführen. IEnumerable<List<int>> auf nur ein Array.

Beispiel:

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

Ich möchte mein gesamtes Ergebnis mitnehmen IEnumerable<List<int>> auf nur einen List<int>

Daher von Quellfeldern: [1,2,3,4] y [5,6,7]

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

Danke

756voto

Mike Two Punkte 42868

Versuchen Sie SelectMany()

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

16 Stimmen

Danke, ich vergesse das immer - ich weiß, dass es da ist, aber ich verbringe jedes Mal viel zu viel Zeit damit, danach zu googeln, wenn ich es benutzen muss. Lesezeichen für diese Antwort :-)

0 Stimmen

Eine Zeit lang hatte ich Angst, dass ich der Einzige bin, der das braucht. Danke Mike!

19 Stimmen

Gibt es eine alternative Syntax für SelectMany( i => i ) ? Ich habe gesehen, dass diese Syntax häufig verwendet wird, aber es scheint eine degenerierte Verwendung der Auswahlfunktion zu sein. Ich hätte erwartet, dass die Sprachdesigner eine Abkürzungssyntax speziell für Listen von Listen entwickelt hätten

93voto

recursive Punkte 80517

Mit Abfragesyntax:

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

0 Stimmen

Danke, genau die Syntax, die ich gesucht habe, und so viele SO-Antworten listen etwas anderes, ausführlicheres auf.

0 Stimmen

Das ist viel, viel besser als SelectMany. Mehr klar, was genau vor sich geht IMO, danke für den Hinweis auf diese!

11 Stimmen

Ich persönlich finde die Version mit Abfragesyntax immer viel weniger intuitiv als die Version mit Methodenaufruf. Wenn Resharper anbietet, Schleifen in LINQ-Ausdrücke zu konvertieren, wenn es mir die Abfragesyntax gibt, entscheide ich mich immer für Rückgängig.

26voto

Dylan Beattie Punkte 51678
iList.SelectMany(x => x).ToArray()

10 Stimmen

@recursive Was haben die anderen verpasst? .ToArray() ? -- Wenn Sie nur einmal iterieren müssen, oder wenn sich die Elemente wahrscheinlich ändern werden, dann .ToArray() ist definitiv nicht das, was Sie wollen. Aber mit statischen Elemente, die Sie gehen, um mehrmals aufzulisten sind, .ToList() o .ToArray() führt zu einer Leistungsverbesserung (auf Kosten eines geringfügig höheren Speicherverbrauchs, was aber in der Regel ein gutes Geschäft ist).

2 Stimmen

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

9 Stimmen

@recursive, wenn wir schon pingelig sind, sagt der OP, dass er zurückkehren muss List<int> also .ToList() wäre dann die richtige Wahl.

15voto

Daniel Punkte 22267

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

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

13voto

mqp Punkte 66863

Etwa so?

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X