2011-11-03 12 views
6

John Skeets odpowiada na to pytanie, Select all unique combinations of a single list, with no repeats, using LINQ, działa niesamowicie.Wybierz wszystkie unikalne kombinacje pojedynczej listy bez powtórzeń, używając LINQ (część 2)

Jednak może ktoś rozbić składnika przez składnik wewnętrzne funkcjonowanie jak pierwsza odpowiedź pracuje:

List<int> slotIds = new List<int> {1, 2, 3}; 
var query = slotIds.SelectMany((value, index) => slotIds.Skip(index + 1), 
           (first, second) => new { first, second }); 
+2

Dlaczego nie pytasz o to w komentarzu pod tą odpowiedzią? –

Odpowiedz

6

To z grubsza odpowiednikiem w koncepcji do tego, mimo że rzeczywisty model wykonanie różni się oczywiście (leniwa itp)

for (int i = 0; i < slotIds.Count; i++) 
{ 
    int first = slotIds[i]; 
    for (int j = i + 1; j < slotIds.Count; j++) 
    { 
     int second = slotIds[j]; 
     results.Add(new { first, second }); 
    } 
} 

SelectMany przy wystającą value i index jest sposób wykorzystania zarówno first i i, aby utworzyć wewnętrzną pętlę. Potrzebujemy indeksu, aby pomijać wartości index + 1, co jest równoważne z pętlą j zaczynającą się od i + 1 w powyższym kodzie.

Czy to pomaga? Jeśli nie, czy mógłbyś wskazać, który fragment jest mylący?

EDYCJA: Aargh - Nie zdawałem sobie sprawy, że inne pytanie, na które się powołujesz, zaczęło się od tego kodu! Myślę, że nadal jest to przydatne, aby pod akapitem poniżej coś się zawiesić ...

Jeśli zrozumiałeś alternatywną (wyrażenie zapytania) wersję mojej odpowiedzi, to pierwsza wersja jest podobna, po prostu używając przeciążenia z SelectMany co pozwala ci użyć zarówno wartości, jak i indeksu w "zewnętrznej" sekwencji.

+0

Używasz tej przeładowanej wersji SelectMany, http://msdn.microsoft.com/en-us/library/bb534732.aspx, więc collectionSelector tworzy "wewnętrzną pętlę", tj. {2, index = 1} {3, index = 2}, a wynik tego wyniku powoduje, że resultSelector (druga funkcja lambda)? Rozumiem twoje inne przykłady, myślę, że moje pomieszanie jest z funkcjami lambda i jak druga funkcja lambda buduje listę. – Seth

+0

@Seth: Selektor kolekcji jest bitem, który otrzymuje odpowiednik 'i' i' first' w kodzie w tej odpowiedzi. Te wartości (i i pierwsze) są następnie używane w 'resultSelector'. –

Powiązane problemy