2016-01-29 14 views
12

że ma pętlę, jak następuje:Linq do pętli zagnieżdżonej

foreach(x in myColl) 
{ 
    foreach(var y in x.MyList) 
    { 
     result.Add(x.MyKey + y) 
    } 
} 

Oznacza to, że w moim wewnętrznej pętli i potrzebny jest dostęp do właściwości obecnego zewnętrznego elementu.

Szukam instrukcji LINQ, ale nie jestem pewien. Próbowałem go za pomocą

result = myColl 
    .SelectMany(x => x.MyList) 
    .SelectMany(x => /* how to get the key of the outer loop here */ + x) 
+3

zagnieżdżone dla każdego są łatwe do odczytania, gdzie kwerendy LINQ może być bardziej skomplikowane. Dlaczego uważasz, że musisz użyć linq w tym przypadku? – Loofer

Odpowiedz

14

To jest łatwe z wyrażeń zapytania:

(from x in myColl 
from y in x.MyList 
select x.MyKey + y).ToList() 

To działa, ponieważ przekłada się to:

myColl 
.SelectMany(x => x.MyList.Select(item => new { List = x, Item = item })) 
.Select(x => ...) //rest of the query, whatever you like 

Kluczem jest zachowaj zarówno listę, jak i elementy listy. Przeprowadź ich przez zapytanie za pomocą anonimowego typu (lub dowolnego innego kontenera).

+0

Należy podać właściwości anonimowe. –

+0

Otrzymują swoją domyślną nazwę od wyrażenia. To działa. Dziękuję za edycję. – usr

+0

Jestem prawie pewna, że ​​drugie 'SelectMany' powinno być po prostu' Select', lub prawdopodobnie przełoży się na przeciążenie 'SelectMany' w odpowiedzi Tormoda. – juharr

5

Jest overload of SelectMany który umożliwia dostęp do „macierzystego” elementu. ListOfList.SelectMany (lista => list.InnerList, (LST, element) => HandleInnerListAndElementFromIt (LST, element))

result = myColl.SelectMany(x => x.MyList,(x1,x2)=>DoSomething(x1,x2)); 

EDIT Dodano:

Dla Państwa konkretnym przykładzie wygląda to tak :

result = myColl.SelectMany(x=>x.MyList,(x,y)=>x.MyKey+y)); 

zauważyć, że istnieją dwa parametry lambda do SelectMany metoda połączenia.

Pierwsza lambda przyjmie "x" i zwróci nową liczbę. x => x.MyList

Druga wartość lambda przyjmuje "x" i "y" i daje nowy wynik. (x, y) => x.MyKey + y

+1

Muszę przyznać, że chociaż wygląda fajnie i robi to, czego potrzebuję, jest to dość trudne do odczytania. – HimBromBeere

+0

Widzę to. Edytowałem dla jasności. Powodzenia. – Tormod

4

To kiedy ja osobiście wolę składnia kwerendy

var result = from x in myCol1 
      from y in x.MyList 
      select x.MyKey + y; 
+0

Tak łatwo ... Wiedziałem, że to musi działać. Dzięki :) – HimBromBeere