LINQを使用して、複数の配列からすべての可能な組み合わせを生成する:デカルト製品アプローチ
この記事では、LINQ(言語統合クエリ)を活用して、デカルト製品を使用して複数の配列からすべての可能な組み合わせを効率的に生成する方法を示しています。 目的の出力形式は、パターンに続く文字列表現ですa(i) b(j) c(k) n(p)
、ここで、i
、j
、k
、および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
と組み合わせて、最終出力文字列を作成します。
arr2
arr1
ヘルパー関数Zip
arr1
関数の実装の可能性があります:
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 サイトの他の関連記事を参照してください。