Heim > Backend-Entwicklung > C++ > Wie kann ich mit LINQ effizient eine zufällige Teilmenge aus einer Sammlung abrufen?

Wie kann ich mit LINQ effizient eine zufällige Teilmenge aus einer Sammlung abrufen?

Susan Sarandon
Freigeben: 2024-12-31 20:01:14
Original
906 Leute haben es durchsucht

How Can I Efficiently Get a Random Subset from a Collection Using LINQ?

Optimierung von LINQ: Erhalten einer zufällig gemischten Untersammlung

Die Bestimmung effizienter Methoden zum Abrufen zufälliger Teilmengen einer größeren Sammlung ist eine häufige Herausforderung in Programmierung. Für LINQ-Abfragen besteht ein Ansatz darin, die Shuffle()-Erweiterungsmethode zu nutzen.

Die Shuffle-Methode:

Die Shuffle()-Methode verwendet eine IEnumerable-Sammlung als Eingabe und gibt eine gemischte Version davon zurück. Diese Methode ist besonders nützlich, wenn man eine zufällige Reihenfolge der Elemente in einer Sammlung erhalten muss.

Fisher-Yates-Durstenfeld Shuffle:

Die Shuffle()-Methode verwendet den Fisher-Yates-Durstenfeld-Shuffle-Algorithmus, der eine robuste und effiziente Möglichkeit zum Mischen einer Sammlung bietet. Dieser Algorithmus beinhaltet das Durchlaufen der Sammlung, während Elemente nach dem Zufallsprinzip mit nachfolgenden Elementen ausgetauscht werden.

LINQ-Erweiterungsmethode:

Unten finden Sie eine LINQ-freundliche Erweiterungsmethode, die das Fisher- implementiert. Yates-Durstenfeld-Shuffle zur Verwendung mit IEnumerable Sammlungen:

public static class EnumerableExtensions
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
    {
        return source.Shuffle(new Random());
    }

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
    {
        if (source == null) throw new ArgumentNullException(nameof(source));
        if (rng == null) throw new ArgumentNullException(nameof(rng));

        return source.ShuffleIterator(rng);
    }

    private static IEnumerable<T> ShuffleIterator<T>(
        this IEnumerable<T> source, Random rng)
    {
        var buffer = source.ToList();
        for (int i = 0; i < buffer.Count; i++)
        {
            int j = rng.Next(i, buffer.Count);
            yield return buffer[j];

            buffer[j] = buffer[i];
        }
    }
}
Nach dem Login kopieren

Verwendung:

Um die Shuffle()-Methode zu verwenden, können Sie sie einfach für Ihre gewünschte Sammlung aufrufen:

var yourCollection = new List<int> { 1, 2, 3, 4, 5 };
var randomItems = yourCollection.Shuffle().Take(3);
Nach dem Login kopieren

Dies ergibt eine gemischte Sammlung von 3 zufälligen Gegenständen aus Ihrer Sammlung. Standardmäßig verwendet die Shuffle()-Methode eine neue Random()-Instanz zur Randomisierung. Sie können auch eine benutzerdefinierte Zufallsinstanz für benutzerdefiniertes Mischverhalten angeben.

Das obige ist der detaillierte Inhalt vonWie kann ich mit LINQ effizient eine zufällige Teilmenge aus einer Sammlung abrufen?. 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