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
Libérer: 2025-01-31 05:36:10
original
387 Les gens l'ont consulté

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>
Copier après la connexion
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
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 })
    );
}
Copier après la connexion

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:

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);
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal