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

Odpowiedzi:


567

Próbować SelectMany()

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

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;

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()

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);

11

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

List<int> flatList= k.SelectMany( v => v).ToList();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.