首頁 >後端開發 >C++ >如何使用linq使用笛卡爾產品從多個陣列中生成所有可能的組合?

如何使用linq使用笛卡爾產品從多個陣列中生成所有可能的組合?

Patricia Arquette
Patricia Arquette原創
2025-01-31 05:31:13532瀏覽

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)的字符串表示形式,其中ijkp>是每個數組定義的範圍內的索引。

了解笛卡爾產品> 笛卡爾產品是一個基本的數學概念。 給定的集合A和B,笛卡爾產品A X B是所有有序對(a,b)的集合,其中“ A”屬於A和'B'屬於B。 例如,如果a = {a,b}和b = {1,2},則a x b = {(a,1),(a,2),(b,1),(b,1),(b, b, 2)}。

linq實現

以下LINQ代碼生成所需的組合:> 此代碼利用A

輔助功能(下面詳細介紹)來計算從生成的序列的笛卡爾產物。

中的每個元素都定義了中相應元素的索引範圍。然後,

方法將結果與
<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>
>創建最終輸出字符串結合在一起。

CartesianProductarr2助手函數arr2arr1> 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn