13 votes

Sélectionner toutes les combinaisons uniques d'une liste unique, sans répétitions, en utilisant LINQ

J'ai une liste de nombres, et je dois créer toutes les combinaisons uniques possibles des nombres de la liste, sans répétitions, en utilisant une requête LINQ. Donc, par exemple, si j'ai { 1, 2, 3 } les combinaisons seraient les suivantes 1-2 , 1-3 y 2-3 .

J'utilise actuellement deux for des boucles, comme ça :

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 des boucles à LINQ ?

Gracias.

31voto

Jon Skeet Points 692016

Bien sûr - vous pouvez le faire en 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 });

Voici une option alternative, qui n'utilise pas tout à fait une telle surcharge ésotérique de 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 };

Ils font pratiquement la même chose, mais de manière légèrement différente.

Voici une autre option qui est beaucoup plus proche de votre 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 };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X