2010-08-13 14 views
11

Mam listę numerów i muszę utworzyć każdą możliwą unikalną kombinację liczb na liście, bez powtórzeń, za pomocą kwerendy LINQ. Tak więc, na przykład, jeśli mam { 1, 2, 3 }, kombinacje będą następujące: 1-2, 1-3 i 2-3.Wybierz wszystkie unikalne kombinacje pojedynczej listy, bez powtórzeń, używając LINQ

Używam obecnie dwa for pętle, tak:

for (int i = 0; i < slotIds.Count; i++) 
{ 
    for (int j = i + 1; j < slotIds.Count; j++) 
    { 
     ExpressionInfo info1 = _expressions[i]; 
     ExpressionInfo info2 = _expressions[j]; 

     // etc... 
    } 
} 

Czy to możliwe, aby przekształcić te dwa for pętle do LINQ?

Dzięki.

Odpowiedz

28

Jasne - można to zrobić w jednym wywołaniu SelectMany z osadzonym wezwanie do Skip:

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

Oto alternatywa, która nie korzysta z całkiem takie ezoteryczne przeciążenie SelectMany:

var query = from pair in slotIds.Select((value, index) => new { value, index }) 
      from second in slotIds.Skip(pair.index + 1) 
      select new { first = pair.value, second }; 

Zasadniczo robią to samo, tylko w nieco inny sposób.

Oto kolejna opcja, która jest znacznie bliżej do oryginału:

var query = from index in Enumerable.Range(0, slotIds.Count) 
      let first = slotIds[index] // Or use ElementAt 
      from second in slotIds.Skip(index + 1) 
      select new { first, second }; 
+0

Zobacz to do dyskusji na temat ezoterycznych pierwszego rozwiązania: http://stackoverflow.com/questions/7991486/select-all-unique- kombinacje pojedynczej listy z bez powtórzeń-używając-linq-pa – Thilo

+1

@David: Nie wierzę żadnej z kolekcji w .NET zwracając elementy w innej kolejności, gdy jest iterowane wiele razy bez zmiany między. Nie obchodzi nas, jaka jest kolejność, o ile jest spójna. –

+0

Dangit, mamy gdzieś najdziwniejszy błąd, dzięki temu usunę moje 2 komentarze: p – David

Powiązane problemy