利用LINQ生成多種組合
給定兩個整數數組,Array1和Array2,我們希望通過將第一個數組中的元素與第二個數組中的對應元素壓縮來創建第一個數組中所有元素的可能組合。例如,給定:
我們希望生成以下組合:
<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中文網其他相關文章!