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
Lepaskan: 2025-01-31 05:36:10
asal
378 orang telah melayarinya

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>
Salin selepas log masuk
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
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 })
    );
}
Salin selepas log masuk

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);
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan