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