2009-10-19 14 views
215

Mam kwerendę LINQ, która zwraca IEnumerable<List<int>>, ale chcę zwrócić tylko List<int>, więc chcę scalić cały mój rekord w moim IEnumerable<List<int>> tylko do jednej tablicy.Flatten List w LINQ

przykład:

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

że chce się całe wynik IEnumerable<List<int>> tylko jeden List<int>

Dlatego też, z tablic źródło: [1,2,3,4] i [5,6 , 7]

Chcę tylko jedna tablica [1,2,3,4,5,6,7]

Dzięki

Odpowiedz

386

Spróbuj SelectMany()

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

Dzięki, ja zawsze zapomnieć ten - wiem, że tam jest, ale Po prostu spędzam zbyt dużo czasu na szukaniu go za każdym razem, gdy muszę go użyć. Dodawanie do zakładek tej odpowiedzi. :-) – BrainSlugs83

+0

Przez chwilę bałam się, że jestem jedynym, który kiedykolwiek tego potrzebował. Dzięki Mike! –

+1

Czy jest jakaś alternatywna składnia dla 'SelectMany (i => i)'? Widziałem, że ta składnia jest często używana, ale wydaje się zdegenerowane użycie funkcji wyboru, więc oczekiwałbym, że projektanci języków wymyślą składnię skrótów specjalnie dla list list. – Andy

7

takiego?

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

Tak, dziękuję za odpowiedź na –

6

Jeśli masz List<List<int>> k można zrobić

List<int> flatList= k.SelectMany(v => v).ToList(); 
19
iList.SelectMany(x => x).ToArray() 
+6

@recursive Czego wszyscy inni przegapili? '.ToArray()'? - To rodzaj poszlakowania - jeśli potrzebujesz tylko powtórzyć raz - lub jeśli elementy mogą się zmienić, to '.ToArray()' zdecydowanie nie jest tym, czego potrzebujesz. Ale przy statycznych pozycjach, które będziesz wielokrotnie wyliczał, '.ToList()' lub '.ToArray()' poprawi wydajność (kosztem nieco większego zużycia pamięci, co zwykle jest całkiem dobrą transakcją). – BrainSlugs83

+2

Przypuszczalnie okoliczności w tym przypadku wymagają tablic, ponieważ zostało to określone w pytaniu. – recursive

+7

@recursive, jeśli jesteśmy otwarci, OP mówi, że musi zwrócić 'List ', więc '.ToList()' będzie wtedy właściwym wyborem. – MEMark

70

składni zapytania:

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

+1 dla alternatywnej składni –

+0

Dokładna składnia, której szukałem, a tylu odpowiedzi na SO zawiera coś jeszcze bardziej gadatliwego. – SilverSideDown

+0

To znacznie lepiej niż SelectMany. Bardziej jasne, co dokładnie dzieje się w IMO, dzięki za wskazanie tego! –