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!