Gunakan LINQ untuk menghasilkan pelbagai kombinasi
Berikan dua Array, Array1 dan Array2. Sebagai contoh, diberikan:
array1: {a, b, c}
Proses ini memerlukan kita untuk mendapatkan serpihan urutan kedua -dua tatasusunan ini. LINQ menyediakan cara langsung untuk menjana Descartes ini:
<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>
Kaedah ini memperoleh urutan urutan, dan gunakan pengendali agregat untuk mengumpul pengumpulan Descartes. Ia bermula dengan urutan kosong sebagai kumulator dan berulang kali menggabungkannya dengan setiap urutan dalam urutan input. Untuk setiap kombinasi, ia memampatkan unsur -unsur dalam kumulator dan unsur -unsur dalam urutan semasa untuk menghasilkan pengumpulan hidroklar.
data termampatstatic 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 }) ); }
Sebaik sahaja kita mempunyai pengumpulan Descartes, kita boleh memampatkan unsur -unsur dalam array pertama dan elemen yang sepadan dalam pelbagai kedua array kedua:
Kaedah CartesianProduct membolehkan kita dengan mudah menjana Descartes pelbagai urutan. Kami membuat urutan urutan dengan menghasilkan julat integer untuk setiap elemen dalam array kedua, dan kemudian kami memampatkan pelbagai descartes ini dengan array pertama untuk membuat gabungan yang diperlukan.
Akhirnya, kita boleh melintasi urutan urutan urutan dan mencetak setiap baris:
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);
Kod ini akan menghasilkan gabungan sebagai rentetan dan mencetaknya ke konsol.
Atas ialah kandungan terperinci Bagaimana untuk menghasilkan semua kemungkinan kombinasi elemen array menggunakan produk Cartesian Linq?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!