Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mendapatkan Subset Rawak dengan Cekap daripada Koleksi Menggunakan 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]; } } }
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);
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!