Heim >Backend-Entwicklung >C++ >Was ist der optimale LINQ-Ansatz zum Erhalten einer zufälligen Teilmenge?

Was ist der optimale LINQ-Ansatz zum Erhalten einer zufälligen Teilmenge?

Barbara Streisand
Barbara StreisandOriginal
2024-12-31 19:58:16476Durchsuche

What's the Optimal LINQ Approach for Getting a Random Subset?

Optimale LINQ-Erweiterung für die Extraktion zufälliger Untersammlungen

In der Welt der Programmierung ist es oft notwendig, eine zufällige Teilmenge aus einer bestimmten Sammlung zu extrahieren. Als LINQ-Enthusiasten fragen Sie sich vielleicht, wie Sie dies am besten erreichen können.

Ein Ansatz besteht darin, die Erweiterungsmethode .Shuffle() zu verwenden, die den Fisher-Yates-Durstenfeld-Shuffle durchführt. Diese Methode randomisiert effektiv die Reihenfolge der Elemente in einer Sammlung und ist somit eine ideale Lösung zum Erstellen einer zufälligen Untersammlung.

Um die Verwendung zu veranschaulichen, nehmen wir an, Sie haben eine Sammlung namens yourCollection mit N Elementen und möchten dies tun Extrahieren Sie n zufällige Elemente, wobei n <= N. So können Sie dies mit der .Shuffle()-Methode implementieren:

var randomItems = yourCollection.Shuffle().Take(n);

Dieser Code mischt zunächst die Elemente hinein yourCollection mithilfe der .Shuffle()-Methode. Anschließend verwendet es die Methode .Take(), um die ersten n Elemente aus der gemischten Sammlung zu extrahieren. Das Ergebnis ist eine zufällige Untersammlung der Anzahl n.

Hier ist ein Beispiel für die Implementierung der .Shuffle()-Erweiterungsmethode selbst:

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

    public static IEnumerable Shuffle(
        this IEnumerable 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 ShuffleIterator(
        this IEnumerable 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];
        }
    }
}

Durch die Verwendung dieser Erweiterungsmethode können Sie dies ganz einfach tun Mischen und extrahieren Sie eine zufällige Untersammlung beliebiger Größe aus einer LINQ-Abfrage. Diese Technik bietet eine bequeme und effiziente Lösung für eine häufige Datenmanipulationsaufgabe.

Das obige ist der detaillierte Inhalt vonWas ist der optimale LINQ-Ansatz zum Erhalten einer zufälligen Teilmenge?. 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