Heim > Backend-Entwicklung > C++ > Wie kann man mit LINQ effizient zufällige Untersammlungen generieren?

Wie kann man mit LINQ effizient zufällige Untersammlungen generieren?

Mary-Kate Olsen
Freigeben: 2025-01-01 03:54:09
Original
978 Leute haben es durchsucht

How to Efficiently Generate Random Subcollections Using LINQ?

Optimale LINQ-Abfrage für zufällige Untersammlungen: Shuffle

Das Generieren einer zufällig gemischten Sammlung mit einer bestimmten Anzahl aus einer größeren Sammlung kann auf verschiedene Arten erreicht werden unter Verwendung von LINQ.

Ein effizienter Ansatz ist die Verwendung des Fisher-Yates-Durstenfeld-Shuffle-Algorithmus, der dies kann als Erweiterungsmethode in LINQ implementiert werden:

public static class EnumerableExtensions
{
    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

Um eine zufällige Untersammlung der Anzahl „n“ aus einer Sammlung von „N“ Elementen abzurufen, wobei n <= N, wenden Sie einfach Shuffle() an. Erweiterungsmethode gefolgt von Take(n):

var randomItems = yourCollection.Shuffle().Take(n);
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann man mit LINQ effizient zufällige Untersammlungen generieren?. 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