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
Susan SarandonOriginal
2024-12-31 20:01:14906Durchsuche

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];
        }
    }
}

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);

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!

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