Produk Cartesian dalam LINQ
Dalam bidang pemprosesan data, produk Cartesian ialah operasi asas yang menggabungkan elemen daripada berbilang set untuk mencipta gabungan baharu. Artikel ini meneroka pendekatan berasaskan LINQ untuk melaksanakan produk Cartesian, khususnya untuk situasi di mana bilangan koleksi tidak diketahui pada masa penyusunan.
Memahami produk Cartesian
Ringkasnya, produk Cartesian menggabungkan setiap elemen dalam satu set dengan setiap elemen dalam set yang lain, menjana semua pasangan yang mungkin. Pertimbangkan satu set orang {p1, p2, p3} dan satu set anjing {d1, d2, d3}. Produk Cartesian bagi kedua-dua set ini ialah:
<code>{(p1, d1), (p1, d2), (p1, d3), (p2, d1), (p2, d2), (p2, d3), (p3, d1), (p3, d2), (p3, d3)}</code>
Pelaksanaan LINQ
Untuk melaksanakan produk Cartesian dalam LINQ, kami boleh menggunakan operator SelectMany. Walau bagaimanapun, apabila bilangan koleksi tidak diketahui pada masa penyusunan, kami memerlukan pendekatan yang lebih fleksibel. Di sinilah kaedah CartesianProduct berperanan:
<code>public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) { // 基本情况:空序列 if (!sequences.Any()) return new[] { Enumerable.Empty<T>() }; // 简化为两个序列 var first = sequences.First(); var rest = sequences.Skip(1); // 递归计算其余部分的笛卡尔积 var cartesianProducts = rest.CartesianProduct(); // 将第一个序列与每个笛卡尔积组合 return from f in first from c in cartesianProducts select f.Concat(c); }</code>
Contoh penggunaan
Pertimbangkan contoh kami sebelum ini tentang seseorang yang mempunyai tiga ekor anjing, masing-masing dengan bilangan anak anjing yang berbeza:
<code>Person person = ...; var puppyCombinations = CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>
Kod ini akan menjana semua kemungkinan kombinasi anak anjing untuk setiap anjing, serupa dengan pertanyaan SQL yang disebut dalam soalan:
<code>{(puppyA, puppyA), (puppyA, puppyB), (puppyB, puppyA), (puppyB, puppyB)}</code>
Kesimpulan
Dengan menggunakan kaedah CartesianProduct, kami boleh mengira produk Cartesian dalam LINQ secara fleksibel dan cekap, walaupun apabila bilangan koleksi tidak diketahui pada masa penyusunan. Ini membuka kemungkinan untuk pelbagai pemprosesan data dan tugas gabungan.
Atas ialah kandungan terperinci Bagaimana untuk Mengira Produk Cartesian dengan Cekap dalam LINQ dengan Bilangan Set yang Tidak Diketahui?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!