Dalam pelbagai senario pengaturcaraan, urutan elemen dalam senarai generik secara rawak adalah operasi biasa. Artikel ini akan memperkenalkan cara terbaik untuk mencapai matlamat ini dalam C#.
Kaedah yang paling disyorkan ialah menggunakan algoritma shuffle Fisher-Yates, yang merupakan algoritma rawak senarai yang terkenal. Untuk menggunakan kaedah ini, sila tentukan kaedah lanjutan, seperti yang ditunjukkan di bawah:
public static void Shuffle<T>(this IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } }
<方法> cara menggunakan:
List<Product> products = GetProducts(); products.Shuffle();
System.Random
System.Security.Cryptography
Pertimbangan Keselamatan Thread
public static void Shuffle<T>(this IList<T> list) { using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider()) { int n = list.Count; while (n > 1) { byte[] box = new byte[1]; do provider.GetBytes(box); while (!(box[0] < (byte)((double)n / 256))); //确保生成的随机数在范围内 int k = (int)(box[0] * (n / 256.0)); T value = list[k]; list[k] = list[n - 1]; list[n - 1] = value; n--; } } }
ThreadSafeRandom
kaedah pengembangan yang dikemas kini
public static class ThreadSafeRandom { [ThreadStatic] private static Random Local; public static Random ThisThreadsRandom { get { return Local ?? (Local = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId))); } } }
<<>
public static void Shuffle<T>(this IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = ThreadSafeRandom.ThisThreadsRandom.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } }
Atas ialah kandungan terperinci Bagaimanakah saya dapat mengosongkan senarai generik dengan cekap di C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!