Optimisation de LINQ : obtention d'une sous-collection aléatoire
Déterminer des méthodes efficaces pour récupérer des sous-ensembles aléatoires d'une plus grande collection est un défi courant dans programmation. Pour les requêtes LINQ, une approche consiste à exploiter la méthode d'extension Shuffle().
La méthode Shuffle :
La méthode Shuffle() prend une collection IEnumerable comme entrée et en renvoie une version mélangée. Cette méthode est particulièrement utile lorsqu'il faut obtenir un ordre aléatoire des éléments d'une collection.
Fisher-Yates-Durstenfeld Shuffle :
La méthode Shuffle() utilise l'algorithme de lecture aléatoire Fisher-Yates-Durstenfeld, qui fournit un moyen robuste et efficace de mélanger une collection. Cet algorithme consiste à parcourir la collection tout en échangeant de manière aléatoire des éléments avec les éléments suivants.
Méthode d'extension LINQ :
Vous trouverez ci-dessous une méthode d'extension compatible LINQ qui implémente le Fisher- Lecture aléatoire Yates-Durstenfeld à utiliser avec IEnumerable collections :
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]; } } }
Utilisation :
Pour utiliser la méthode Shuffle(), vous pouvez simplement l'appeler sur la collection souhaitée :
var yourCollection = new List<int> { 1, 2, 3, 4, 5 }; var randomItems = yourCollection.Shuffle().Take(3);
Cela donnera une collection mélangée de 3 éléments aléatoires de votre collection. Par défaut, la méthode Shuffle() utilise une nouvelle instance Random() pour la randomisation. Vous pouvez également spécifier une instance aléatoire personnalisée pour un comportement de brassage personnalisé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!