Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya dapat mengosongkan senarai generik dengan cekap di C#?
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:
<code class="language-csharp">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; } }</code>
cara menggunakan:
<code class="language-csharp">List<Product> products = GetProducts(); products.Shuffle();</code>menggunakan System.Security.Cryptography untuk meningkatkan rawak
System.Random
System.Security.Cryptography
Pertimbangan Keselamatan Thread
<code class="language-csharp">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--; } } }</code>Apabila menggunakan kaedah pengembangan shuffle dalam aplikasi multi -threaded, adalah perlu untuk memastikan keselamatan benang. Penyelesaian yang mudah adalah untuk mencipta contoh baru
ThreadSafeRandom
kaedah pengembangan yang dikemas kini
<code class="language-csharp">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))); } } }</code>Mengintegrasikan kaedah keselamatan thread ke kaedah lanjutan shuffle:
<code class="language-csharp">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; } }</code>Jawapan Revied ini menyediakan ClererererAnplanations, meningkatkan kebolehbacaan kod (terutamanya peperiksaan rngcryprovider), dan menangani masalah keselamatan yang lebih berkesan.
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!