MC, 15:52 środa, 02.10.2013 r.
Ilustracja do artykułu: .NET & Linq - Łączenie kolekcji list IEnumerable<List<object>> w jedną kolekcję

.NET & Linq - Łączenie kolekcji list IEnumerable<List<object>> w jedną kolekcję

Niewielki fragment kodu, pozwalający na uzyskanie jednej kolekcji elementów z kolekcji list IEnumerable<List<object>>.

W czym problem?

Wyobraźmy sobie sytuację, że mamy listę obiektów, które wystawiają publicznie listę elementów np. typu int. Następnie skorzystajmy z metody Select() dostarczanej przez Linq, tak byśmy zebrali te listy należące do obiektów trzymanych w kolekcji. Kod taki, może wyglądać podobnie do:
// ListaObiektow jest typu List<NaszObiekt>
// NaszObiekt.InnaLista jest typu List<int>


IEnumerable<List<int>> elementy = ListaObiektow.Select(o => o.InnaLista);

Jak widać, w efekcie takiej operacji otrzymaliśmy obiekt typu IEnumerable<List<int>>, co w wielu przypadkach (jeśli nie większości) może nie być zadowalające. W pewnych okolicznościach wygodniej byłoby otrzymać kolekcję samych int-ów, a nie kolekcję list. Rozwiązane nasuwa się samo - stworzyć nowy obiekt, iterując elementy istniejącego, rzecz jednak w tym, że nie musimy tego robić ręcznie w sposób jawny, ponieważ taka funkcjonalność, również jest już dostarczona przez Linq! Całość sprowadza się do odpowiedniego wykorzystania metody SelectMany(). Przejdźmy od razu do modyfikacji poprzedniego kodu:

IEnumerable<int> elementy = ListaObiektow.Select(o => o.InnaLista).SelectMany(i => i);
List<int> elementyLista = ListaObiektow.Select(o => o.InnaLista).SelectMany(i => i).ToList();

No i po krzyku. Warto o tym pamiętać, żeby nie tworzyć zbędnego kodu, bo jak to mówią mądrzy ludzie - to kod psuje aplikacje ;)

Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!

Imię:
Treść: