Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Linq boleh digunakan untuk menghasilkan semua kombinasi yang mungkin dari pelbagai tatasusunan menggunakan produk Cartesian?

Bagaimanakah Linq boleh digunakan untuk menghasilkan semua kombinasi yang mungkin dari pelbagai tatasusunan menggunakan produk Cartesian?

Patricia Arquette
Patricia Arquetteasal
2025-01-31 05:31:13532semak imbas

How Can LINQ Be Used to Generate All Possible Combinations from Multiple Arrays Using the Cartesian Product?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn