2010-08-13 21 views
11

Ho una lista di numeri e ho bisogno di creare ogni combinazione unica dei numeri nell'elenco, senza ripetizioni, utilizzando una query LINQ. Quindi, ad esempio, se ho { 1, 2, 3 }, le combinazioni sarebbero 1-2, 1-3 e 2-3.Selezionare tutte le combinazioni univoche di un singolo elenco, senza ripetizioni, utilizzando LINQ

Attualmente uso due for loop, in questo modo:

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... 
    } 
} 

E 'possibile convertire questi due for cicli di LINQ?

Grazie.

risposta

28

Certo - si può fare in una singola chiamata a SelectMany con una chiamata incorporato per Skip:

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

Ecco un'opzione alternativa, che non usa abbastanza un tale sovraccarico di esoterico di 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 }; 

Questi fanno praticamente la stessa cosa, solo in modi leggermente diversi.

Ecco un'altra opzione che è molto più vicino al tuo originale:

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

vedere questo per una discussione sulla prima soluzione esoterica: http://stackoverflow.com/questions/7991486/select-all-unique- combinazioni-di-una-lista-singola-con-nessuna-ripetizioni-usando-linq-pa – Thilo

+1

@David: Non credo che nessuna delle raccolte in .NET restituisca gli elementi in un ordine diverso quando iterato più volte senza cambia tra. Non ci interessa quale sia l'ordine, a patto che sia coerente. –

+0

Dangit, poi abbiamo il bug più strano da qualche parte, grazie cancellerò i miei 2 commenti: p – David

Problemi correlati