Heim >Backend-Entwicklung >C++ >Wie kann ich eine generische Liste in C#effizient mischen?

Wie kann ich eine generische Liste in C#effizient mischen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-02-03 07:58:131043Durchsuche

Die effiziente Shuffle -Methode der generischen Liste der Generika

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.

Fisher-yates Shuffle Algorithmus Implementierung

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>
Verwenden von System.Security.Cryptographie, um die Zufälligkeit zu verbessern

Obwohl hohe Effizienz, kann es möglicherweise nicht in der Lage sein, eine echte zufällige Sequenz zu erzeugen. Um die Zufälligkeit zu verbessern, bietet Bibliothek eine zuverlässigere Option:

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>
Bei Verwendung der Shuffle Expansion -Methode in Multi -Thread -Anwendungen müssen die Sicherheit der Threads gewährleistet werden. Eine einfache Lösung besteht darin, ein neues Beispiel von

:

zu erstellen

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>
Integrieren Sie die Thread -Sicherheitsmethode in die Shuffle -Erweiterungsmethode:

<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>
Diese Revied -Antwort enthält Clerererererananlagen, verbessert die Code -Lesbarkeit (insbesondere den RNGcryProvider -Examph) und behandelt die Sicherheitsbedenken effektiver.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn