Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Linq boleh digunakan untuk menghasilkan semua kombinasi yang mungkin dari pelbagai tatasusunan menggunakan produk Cartesian?
menggunakan LINQ untuk menghasilkan semua kombinasi yang mungkin dari pelbagai tatasusunan: pendekatan produk Cartesian
Artikel ini menunjukkan cara memanfaatkan LINQ (pertanyaan bersepadu bahasa) untuk menghasilkan semua kombinasi yang mungkin dari pelbagai tatasusunan menggunakan produk Cartesian. Format output yang dikehendaki adalah perwakilan rentetan berikutan corak, di mana a(i) b(j) c(k) n(p)
, i
, j
, dan k
adalah indeks dalam julat yang ditetapkan untuk setiap array. p
Memahami produk Cartesian
Produk Cartesian adalah konsep matematik asas. Diberi set A dan B, produk Cartesian A X B adalah set semua pasangan yang diperintahkan (a, b) di mana 'a' milik A dan 'B' milik B. Ini meluas ke pelbagai set.contohnya, jika a = {a, b} dan b = {1, 2}, maka x b = {(a, 1), (a, 2), (b, 1), (b, 2)}.
Pelaksanaan Linq
Kod LINQ berikut menghasilkan kombinasi yang dikehendaki:
Kod ini menggunakan fungsi penolong
(terperinci di bawah) untuk mengira produk Cartesian urutan yang dihasilkan dari<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>. Setiap elemen dalam
mentakrifkan julat indeks untuk elemen yang sepadan dalam CartesianProduct
. Kaedah arr2
kemudian menggabungkan hasil dengan arr2
untuk membuat rentetan output akhir. arr1
Zip
arr1
fungsi penolong
CartesianProduct
Berikut adalah kemungkinan pelaksanaan fungsi :
CartesianProduct
Fungsi ini secara rekursif mengira produk Cartesian dari bilangan urutan input sewenang -wenangnya.
<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>
Output sampel
Kod, apabila dilaksanakan, menghasilkan output berikut, menunjukkan semua kombinasi yang mungkin:
Ini berkesan mempamerkan kuasa Linq untuk menghasilkan semua kombinasi yang mungkin dan elegan dari pelbagai tatasusunan.
Atas ialah kandungan terperinci Bagaimanakah Linq boleh digunakan untuk menghasilkan semua kombinasi yang mungkin dari pelbagai tatasusunan menggunakan produk Cartesian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!