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]; } }
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);
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!