Maison >développement back-end >C++ >Comment générer toutes les combinaisons possibles d'éléments de tableau à l'aide du produit cartésien de Linq?

Comment générer toutes les combinaisons possibles d'éléments de tableau à l'aide du produit cartésien de Linq?

Barbara Streisand
Barbara Streisandoriginal
2025-01-31 05:36:10389parcourir

How to Generate All Possible Combinations of Array Elements Using LINQ's Cartesian Product?

Utilisez LINQ pour générer une variété de combinaisons

Donnez deux arrays, array1 et array2. Par exemple, étant donné:

array1: {a, b, c}

    array2: {3, 2, 4}
  • Nous voulons générer la combinaison suivante:

Ce processus nous oblige à obtenir le fragment de la séquence de ces deux tableaux. Linq fournit un moyen direct de générer ce descartes:

<code>    a1 b1 c1
    a1 b1 c2
    a1 b1 c3
    a1 b1 c4

    a1 b2 c1
    a1 b2 c2
    a1 b2 c3
    a1 b2 c4


    a2 b1 c1
    a2 b1 c2
    a2 b1 c3
    a2 b1 c4

    a2 b2 c1
    a2 b2 c2
    a2 b2 c3
    a2 b2 c4


    a3 b1 c1
    a3 b1 c2
    a3 b1 c3
    a3 b1 c4

    a3 b2 c1
    a3 b2 c2
    a3 b2 c3
    a3 b2 c4 (最后一行)</code>
Créer descartes

Cette méthode obtient la séquence de la séquence et utilise l'opérateur d'agrégat pour accumuler l'accumulation de Descartes. Il commence par une séquence vide en tant que cumulateur et le combine à plusieurs reprises avec chaque séquence dans la séquence d'entrée. Pour chaque combinaison, il comprime les éléments du cumulateur et les éléments de la séquence actuelle pour générer l'accumulation de hydrochlar.

Données compressées
<code class="language-csharp">static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
    return sequences.Aggregate(
        emptyProduct,
        (accumulator, sequence) =>
            from accseq in accumulator
            from item in sequence
            select accseq.Concat(new[] { item })
    );
}</code>

Une fois que nous avons l'accumulation de Descartes, nous pouvons comprimer les éléments du premier tableau et l'élément correspondant dans le deuxième tableau du deuxième tableau:

La méthode CartesianProduct nous permet de générer facilement les descartes de plusieurs séquences. Nous créons une séquence d'une séquence en générant une plage entière pour chaque élément du deuxième tableau, puis nous compressons cette gamme de Descartes avec le premier tableau pour créer la combinaison requise.

Enfin, nous pouvons traverser la séquence de la séquence de la séquence et imprimer chaque ligne:

<code class="language-csharp">var arr1 = new[] { "a", "b", "c" };
var arr2 = new[] { 3, 2, 4 };
var result = from cpLine in CartesianProduct(
                 from count in arr2 select Enumerable.Range(1, count))
             select cpLine.Zip(arr1, (x1, x2) => x2 + x1);</code>

Ce code générera une combinaison en tant que chaîne et l'imprimera à la console.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn