Spłaszcz listę w LINQ

313

Mam zapytanie LINQ, które zwraca, IEnumerable<List<int>>ale chcę tylko zwrócić, List<int>więc chcę scalić cały mój rekord w mojej IEnumerable<List<int>>z tylko jedną tablicą.

Przykład:

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

Chcę przenieść cały mój wynik IEnumerable<List<int>>tylko na jedenList<int>

Stąd z tablic źródłowych: [1,2,3,4] i [5,6,7]

Chcę tylko jedną tablicę [1,2,3,4,5,6,7]

Dzięki

Cédric Boivin
źródło

Odpowiedzi:

567

Próbować SelectMany()

var result = iList.SelectMany( i => i );
Mike Two
źródło
8
Dzięki, zawsze o tym zapominam - wiem, że tam jest, ale spędzam o wiele za dużo czasu na googlowanie za każdym razem, gdy muszę go używać. Dodanie odpowiedzi do zakładek. :-)
BrainSlugs83
Przez chwilę obawiałem się, że tylko ja tego potrzebuję. Dzięki Mike!
Arnab Chakraborty
7
Czy istnieje jakaś alternatywna składnia SelectMany( i => i )? Często widziałem tę składnię, ale zdaje się, że funkcja select jest zdegenerowana, więc spodziewałem się, że projektanci języków opracują składnię skrótów specjalnie dla list list
Andy
86

Ze składnią zapytania:

var values =
from inner in outer
from value in inner
select value;
rekurencyjny
źródło
Dzięki dokładnej składni, której szukałem, i tak wiele odpowiedzi SO wymienia coś jeszcze bardziej szczegółowego.
SilverSideDown
To o wiele, wiele lepiej niż SelectMany. Wyjaśnij dokładnie, co się dzieje w IMO, dziękuję za zwrócenie na to uwagi!
Bryan Rayner
3
Osobiście zawsze uważam, że wersja składni zapytania jest znacznie mniej intuicyjna niż wersja wywołująca metodę. Kiedy Resharper oferuje konwersję pętli na wyrażenia LINQ, jeśli daje mi składnię zapytania, zawsze wybieram opcję cofnięcia.
bikeman868,
23
iList.SelectMany(x => x).ToArray()
Dylan Beattie
źródło
6
@recursive Co przegapili wszyscy inni? .ToArray()? - To jest trochę poszlakowe - jeśli musisz powtórzyć tylko raz - lub jeśli elementy mogą się zmienić, .ToArray()to zdecydowanie nie jest to, czego chcesz. Ale przy elementach statycznych, które zamierzasz wyliczyć wiele razy .ToList()lub .ToArray()da to poprawę wydajności (kosztem nieco wyższego zużycia pamięci, co zwykle jest całkiem niezłą okazją).
BrainSlugs83
2
Przypuszczalnie okoliczności w tym przypadku wymagają tablic, ponieważ zostało to określone w pytaniu.
rekurencyjny
8
@recursive, jeśli robimy dupki, PO mówi, że musi wrócić List<int>, więc .ToList()byłby to właściwy wybór.
UWAGA
@MEMark OP stwierdza również „tylko do jednej tablicy”
StefanJanssen
12

Lubię to?

var iList = Method().SelectMany(n => n);
mqp
źródło
11

Jeśli masz, List<List<int>> kmożesz to zrobić

List<int> flatList= k.SelectMany( v => v).ToList();
Daniel
źródło