首頁 > 後端開發 > C++ > 如何使用Linq的笛卡爾產品生成數組元素的所有可能組合?

如何使用Linq的笛卡爾產品生成數組元素的所有可能組合?

Barbara Streisand
發布: 2025-01-31 05:36:10
原創
439 人瀏覽過

How to Generate All Possible Combinations of Array Elements Using LINQ's Cartesian Product?

利用LINQ生成多種組合

給定兩個整數數組,Array1和Array2,我們希望通過將第一個數組中的元素與第二個數組中的對應元素壓縮來創建第一個數組中所有元素的可能組合。例如,給定:

  • Array1: {a, b, c}
  • Array2: {3, 2, 4}

我們希望生成以下組合:

<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>
登入後複製

此過程需要我們獲取表示這兩個數組的序列的笛卡爾積。 LINQ提供了一種生成此笛卡爾積的直接方法:

創建笛卡爾積

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 })
    );
}
登入後複製

此方法獲取序列的序列,並使用Aggregate運算符累積笛卡爾積。它以空序列作為累加器開始,並重複地將它與輸入序列中的每個序列組合。對於每個組合,它將累加器中的元素與當前序列中的元素壓縮以生成笛卡爾積。

壓縮數據

一旦我們有了笛卡爾積,我們就可以將第一個數組中的元素與第二個數組的笛卡爾積中的對應元素壓縮:

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);
登入後複製

CartesianProduct方法允許我們輕鬆地生成多個序列的笛卡爾積。我們通過為第二個數組中的每個元素生成整數範圍來創建一個序列的序列,然後我們將這些範圍的笛卡爾積與第一個數組壓縮以創建所需的組合。

最後,我們可以遍歷生成的序列的序列,並打印每一行:

foreach (var line in result)
{
    foreach (var s in line)
        Console.Write(s);
    Console.WriteLine();
}
登入後複製

這段代碼將生成組合作為字符串,並將其打印到控制台。

以上是如何使用Linq的笛卡爾產品生成數組元素的所有可能組合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板