2010-08-13 4 views
11

J'ai une liste de nombres, et j'ai besoin de créer chaque combinaison unique possible des nombres dans la liste, sans répétition, en utilisant une requête LINQ. Ainsi, par exemple, si j'ai { 1, 2, 3 }, les combinaisons seraient 1-2, 1-3 et 2-3.Sélectionnez toutes les combinaisons uniques d'une seule liste, sans répétitions, en utilisant LINQ

J'utilise actuellement deux for boucles, comme ceci:

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

Est-il possible de convertir ces deux for boucles LINQ?

Merci.

Répondre

28

Bien sûr - vous pouvez le faire dans un seul appel à SelectMany avec un appel intégré à Skip:

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

est ici une autre option, qui n'utilise pas tout à fait une telle surcharge ésotérique de SelectMany: Ils font fondamentalement la même chose, mais de manière légèrement différente.

est ici une autre option qui est beaucoup plus proche de l'original:

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

Voir ce pour une discussion sur la première solution ésotérique: http://stackoverflow.com/questions/7991486/select-all-unique- combinaisons-d'-une-liste-unique-avec-aucun-repeats-using-linq-pa – Thilo

+1

@David: Je ne crois pas que les collections dans .NET retournent des éléments dans un ordre différent quand ils sont répétés plusieurs fois sans changements entre. Nous ne nous soucions pas de l'ordre, tant que c'est cohérent. –

+0

Dangit, alors nous avons le bug le plus étrange quelque part, merci je vais supprimer mes 2 commentaires: p – David

Questions connexes