Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk menghasilkan semua kemungkinan kombinasi elemen array menggunakan produk Cartesian Linq?

Bagaimana untuk menghasilkan semua kemungkinan kombinasi elemen array menggunakan produk Cartesian Linq?

Barbara Streisand
Barbara Streisandasal
2025-01-31 05:36:10406semak imbas

How to Generate All Possible Combinations of Array Elements Using LINQ's Cartesian Product?

Gunakan LINQ untuk menghasilkan pelbagai kombinasi

Berikan dua Array, Array1 dan Array2. Sebagai contoh, diberikan:

array1: {a, b, c}

    array2: {3, 2, 4}
  • kami mahu menghasilkan gabungan berikut:

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>
Buat Descartes

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 termampat
<code class="language-csharp">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 })
    );
}</code>

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:

<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);</code>

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!

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