Heim > Backend-Entwicklung > C++ > Wie kann ich mit LINQ eine Teilmenge einer Sammlung zufällig mischen?

Wie kann ich mit LINQ eine Teilmenge einer Sammlung zufällig mischen?

DDD
Freigeben: 2025-01-01 08:05:09
Original
214 Leute haben es durchsucht

How Can I Randomly Shuffle a Subset of a Collection Using LINQ?

Zufälliges Mischen einer Teilsammlung in LINQ mithilfe von Fisher-Yates-Durstenfeld

Beim Umgang mit großen Datensätzen wird das Erhalten einer zufällig gemischten Sammlung einer bestimmten Größe aus einer bestimmten Sammlung vereinfacht entscheidend. Dies tritt häufig in Szenarien mit zufälliger Auswahl oder Stichprobe auf. Lassen Sie uns eine optimale LINQ-basierte Lösung für dieses Problem untersuchen.

Der Fisher-Yates-Durstenfeld-Shuffle-Algorithmus bietet einen effizienten und zuverlässigen Ansatz für das zufällige Shuffling. In diesem Zusammenhang besteht das Ziel darin, eine zufällige Teilmenge der Größe „n“ aus einer Sammlung von „N“ Elementen zu erzeugen, wobei „n“ kleiner oder gleich „N“ ist.

Um diesen Algorithmus zu implementieren Mit LINQ können wir eine Erweiterungsmethode nutzen, die den Shuffle-Vorgang kapselt. Der folgende Codeausschnitt stellt eine umfassende Implementierung bereit:

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

In dieser Implementierung akzeptiert die Shuffle-Erweiterungsmethode eine Eingabesequenzquelle und eine Instanz von Random mit dem Namen rng. Es erstellt eine Pufferliste aus der Eingabesequenz und durchläuft diese, wobei Elemente zufällig ausgewählt werden. Die ausgewählten Elemente werden als Iterator zurückgegeben, wobei die zufällige Reihenfolge erhalten bleibt.

Um diese Erweiterungsmethode zu nutzen, hängen Sie einfach .Shuffle() an die Eingabesequenz an, gefolgt von .Take(n), wobei n die gewünschte Größe darstellt der gemischten Teilsammlung. Zum Beispiel:

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

Dieser Linq-basierte Ansatz bietet eine prägnante und effiziente Lösung für das zufällige Mischen und Erhalten einer Untersammlung beliebiger Größe aus einer bestimmten Sammlung. Es eignet sich besonders für Szenarien, in denen eine echte Randomisierung erforderlich ist.

Das obige ist der detaillierte Inhalt vonWie kann ich mit LINQ eine Teilmenge einer Sammlung zufällig 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage