Maison >développement back-end >C++ >Comment calculer efficacement des produits cartésiens dans LINQ avec un nombre d'ensembles inconnu ?

Comment calculer efficacement des produits cartésiens dans LINQ avec un nombre d'ensembles inconnu ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-18 08:51:09233parcourir

How to Efficiently Compute Cartesian Products in LINQ with an Unknown Number of Sets?

Produit cartésien dans LINQ

Dans le domaine du traitement des données, le produit cartésien est une opération de base qui combine des éléments de plusieurs ensembles pour créer de nouvelles combinaisons. Cet article explore une approche basée sur LINQ pour implémenter des produits cartésiens, en particulier pour les situations où le nombre de collections est inconnu au moment de la compilation.

Comprendre le produit cartésien

En termes simples, le produit cartésien combine chaque élément d'un ensemble avec chaque élément de l'autre ensemble, générant toutes les associations possibles. Considérons un ensemble de personnes {p1, p2, p3} et un ensemble de chiens {d1, d2, d3}. Le produit cartésien de ces deux ensembles sera :

<code>{(p1, d1), (p1, d2), (p1, d3),
 (p2, d1), (p2, d2), (p2, d3),
 (p3, d1), (p3, d2), (p3, d3)}</code>

Implémentation LINQ

Afin d'exécuter un produit cartésien dans LINQ, nous pouvons utiliser l'opérateur SelectMany. Cependant, lorsque le nombre de collections est inconnu au moment de la compilation, nous avons besoin d'une approche plus flexible. C'est là qu'intervient la méthode CartesianProduct :

<code>public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    // 基本情况:空序列
    if (!sequences.Any())
        return new[] { Enumerable.Empty<T>() };

    // 简化为两个序列
    var first = sequences.First();
    var rest = sequences.Skip(1);

    // 递归计算其余部分的笛卡尔积
    var cartesianProducts = rest.CartesianProduct();

    // 将第一个序列与每个笛卡尔积组合
    return from f in first
           from c in cartesianProducts
           select f.Concat(c);
}</code>

Exemple d'utilisation

Considérons notre exemple précédent d'une personne avec trois chiens, chacun avec un nombre différent de chiots :

<code>Person person = ...;
var puppyCombinations = CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>

Ce code générera toutes les combinaisons possibles de chiots pour chaque chien, similaire à la requête SQL mentionnée dans la question :

<code>{(puppyA, puppyA),
 (puppyA, puppyB),
 (puppyB, puppyA),
 (puppyB, puppyB)}</code>

Conclusion

En utilisant la méthode CartesianProduct, nous pouvons calculer les produits cartésiens dans LINQ de manière flexible et efficace, même lorsque le nombre de collections est inconnu au moment de la compilation. Cela ouvre des possibilités pour une variété de tâches de traitement et de combinaison de données.

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