Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mendapatkan Subset Rawak dengan Cekap daripada Koleksi Menggunakan LINQ?

Bagaimanakah Saya Boleh Mendapatkan Subset Rawak dengan Cekap daripada Koleksi Menggunakan LINQ?

Susan Sarandon
Lepaskan: 2024-12-31 20:01:14
asal
928 orang telah melayarinya

How Can I Efficiently Get a Random Subset from a Collection Using LINQ?

Mengoptimumkan LINQ: Mendapatkan Sub-Koleksi Kocok Rawak

Menentukan kaedah yang cekap untuk mendapatkan subset rawak bagi koleksi yang lebih besar adalah cabaran biasa dalam pengaturcaraan. Untuk pertanyaan LINQ, satu pendekatan ialah memanfaatkan kaedah sambungan Shuffle().

Kaedah Kocok:

Kaedah Shuffle() mengambil koleksi IEnumerable sebagai inputnya dan mengembalikan versi kocoknya. Kaedah ini amat berguna apabila seseorang perlu mendapatkan susunan rawak unsur dalam koleksi.

Fisher-Yates-Durstenfeld Shuffle:

The Shuffle() method menggunakan algoritma shuffle Fisher-Yates-Durstenfeld, yang menyediakan cara yang mantap dan cekap untuk merombak koleksi. Algoritma ini melibatkan lelaran melalui koleksi sambil menukar unsur secara rawak dengan elemen seterusnya.

Kaedah Sambungan LINQ:

Di bawah ialah kaedah sambungan mesra LINQ yang melaksanakan Fisher- Kocok Yates-Durstenfeld untuk digunakan dengan IEnumerable koleksi:

public static class EnumerableExtensions
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
    {
        return source.Shuffle(new Random());
    }

    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

Penggunaan:

Untuk menggunakan kaedah Shuffle(), anda boleh memanggilnya pada koleksi yang anda inginkan:

var yourCollection = new List<int> { 1, 2, 3, 4, 5 };
var randomItems = yourCollection.Shuffle().Take(3);
Salin selepas log masuk

Ini akan menghasilkan koleksi kocok 3 item rawak daripada Koleksi anda. Secara lalai, kaedah Shuffle() menggunakan contoh Random() baharu untuk rawak. Anda juga boleh menentukan tika Rawak tersuai untuk gelagat kocok tersuai.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Subset Rawak dengan Cekap daripada Koleksi 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan