In verschiedenen Programmierszenarien ist die Reihenfolge der Elemente in zufällig generischen Listen eine gemeinsame Operation. Dieser Artikel wird den besten Weg einführen, um dieses Ziel in C#zu erreichen.
Die am meisten empfohlene Methode ist die Verwendung des Fisher-Yates-Shuffle-Algorithmus, der ein bekannter Listen-Randomisierungsalgorithmus ist. Um diese Methode zu verwenden, definieren Sie bitte eine Erweiterungsmethode, wie unten gezeigt:
<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>
wie man verwendet:
<code class="language-csharp">List<Product> products = GetProducts(); products.Shuffle();</code>
System.Random
System.Security.Cryptography
Überlegungen zur Sicherheit von Thread -Sicherheit
<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>
ThreadSafeRandom
Die aktualisierte Erweiterungsmethode
<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>
<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>
Das obige ist der detaillierte Inhalt vonWie kann ich eine generische Liste in C#effizient mischen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!