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
Freigeben: 2025-02-03 07:58:13
Original
1003 Leute haben es durchsucht

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>
Nach dem Login kopieren

wie man verwendet:

<code class="language-csharp">List<Product> products = GetProducts();
products.Shuffle();</code>
Nach dem Login kopieren
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>
Nach dem Login kopieren
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>
Nach dem Login kopieren
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>
Nach dem Login kopieren
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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage