Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Kocok Subset Koleksi Secara Rawak Menggunakan LINQ?

Bagaimanakah Saya Boleh Kocok Subset Koleksi Secara Rawak Menggunakan LINQ?

DDD
Lepaskan: 2025-01-01 08:05:09
asal
209 orang telah melayarinya

How Can I Randomly Shuffle a Subset of a Collection Using LINQ?

Mengocok Subkoleksi secara rawak dalam LINQ Menggunakan Fisher-Yates-Durstenfeld

Apabila berurusan dengan set data yang besar, mendapatkan koleksi yang dikocok secara rawak dengan saiz tertentu daripada koleksi tertentu menjadi penting. Ini biasanya timbul dalam senario yang melibatkan pemilihan rawak atau persampelan. Mari kita terokai penyelesaian berasaskan LINQ yang optimum untuk masalah ini.

Algoritma shuffle Fisher-Yates-Durstenfeld menawarkan pendekatan yang cekap dan boleh dipercayai untuk mengocok rawak. Dalam konteks ini, matlamatnya adalah untuk menghasilkan subset rawak saiz 'n' daripada koleksi elemen 'N', dengan 'n' kurang daripada atau sama dengan 'N.'

Untuk melaksanakan algoritma ini menggunakan LINQ, kita boleh memanfaatkan kaedah sambungan yang merangkumi operasi shuffle. Coretan kod berikut menyediakan pelaksanaan yang komprehensif:

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
{
    if (source == null) throw new ArgumentNullException(nameof(source));
    if (rng == null) throw new ArgumentNullException(nameof(rng));

    return source.ShuffleIterator(rng);
}

private static IEnumerable<T> ShuffleIterator<T>(
    this IEnumerable<T> source, Random rng)
{
    var buffer = source.ToList();
    for (int i = 0; i < buffer.Count; i++)
    {
        int j = rng.Next(i, buffer.Count);
        yield return buffer[j];

        buffer[j] = buffer[i];
    }
}
Salin selepas log masuk

Dalam pelaksanaan ini, kaedah sambungan Kocok menerima sumber jujukan input dan tika Rawak bernama rng. Ia mencipta senarai penimbal daripada jujukan input dan berulang melaluinya, memilih elemen secara rawak. Elemen yang dipilih dikembalikan sebagai lelaran, mengekalkan susunan rawak.

Untuk menggunakan kaedah sambungan ini, cuma tambahkan .Shuffle() pada urutan input diikuti dengan .Take(n), dengan n mewakili saiz yang diingini daripada subkoleksi yang dikocok. Contohnya:

var randomItems = yourCollection.Shuffle().Take(n);
Salin selepas log masuk

Pendekatan berasaskan Linq ini menyediakan penyelesaian yang ringkas dan cekap untuk merombak secara rawak dan mendapatkan subkoleksi mana-mana saiz daripada koleksi tertentu. Ia amat sesuai untuk senario di mana rawak sebenar diperlukan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Kocok Subset Koleksi Secara Rawak Menggunakan LINQ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan