ホームページ >バックエンド開発 >C++ >LINQを使用して、デカルト製品を使用して複数の配列からすべての可能な組み合わせを生成するにはどうすればよいですか?

LINQを使用して、デカルト製品を使用して複数の配列からすべての可能な組み合わせを生成するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-31 05:31:13561ブラウズ

How Can LINQ Be Used to Generate All Possible Combinations from Multiple Arrays Using the Cartesian Product?

LINQを使用して、複数の配列からすべての可能な組み合わせを生成する:デカルト製品アプローチ

この記事では、LINQ(言語統合クエリ)を活用して、デカルト製品を使用して複数の配列からすべての可能な組み合わせを効率的に生成する方法を示しています。 目的の出力形式は、パターンに続く文字列表現ですa(i) b(j) c(k) n(p)、ここで、ijk、およびpは、各配列の定義範囲内のインデックスです。

デカルト製品を理解

デカルト製品は、基本的な数学的概念です。 セットAとBを考えると、デカルト製品A X Bは、「A」がAに属し、「B」がBに属しているすべての順序付けられたペア(A、B)のセットです。これは複数のセットに拡張されます。 たとえば、

a = {a、b}およびb = {1、2}の場合、a x b = {(a、1)、(a、2)、(b、1)、(b、(b、) 2)}。

linq実装

次のLINQコードは、目的の組み合わせを生成します:

このコードは、

から生成されたシーケンスのデカルト積を計算するために、
<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);

// Helper function (implementation below)
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(params IEnumerable<IEnumerable<T>>[] sequences) { ... } </code>
ヘルパー関数(以下で詳細)を使用します。 の各要素は、対応する要素のインデックスの範囲を

に定義します。次に、CartesianProductメソッドと結果をarr2と組み合わせて、最終出力文字列を作成します。 arr2arr1ヘルパー関数Ziparr1

関数の実装の可能性があります: CartesianProduct この関数は、任意の数の入力シーケンスのデカルト積を再帰的に計算します。

サンプル出力CartesianProduct

<code class="language-csharp">public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(params IEnumerable<IEnumerable<T>>[] sequences)
{
    if (sequences == null)
        throw new ArgumentNullException(nameof(sequences));

    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };

    return sequences.Aggregate(
        emptyProduct,
        (accumulator, sequence) =>
            from acc in accumulator
            from item in sequence
            select acc.Concat(new[] { item })
    );
}</code>
コードが実行されたとき、次の出力を生成し、すべての可能な組み合わせを示します。

これは、複数の配列からすべての可能な組み合わせを簡潔かつエレガントに生成するためのLINQの力を効果的に示しています。

以上がLINQを使用して、デカルト製品を使用して複数の配列からすべての可能な組み合わせを生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。