Maison > développement back-end > C++ > Comment puis-je obtenir efficacement un sous-ensemble aléatoire d'une collection à l'aide de LINQ ?

Comment puis-je obtenir efficacement un sous-ensemble aléatoire d'une collection à l'aide de LINQ ?

Susan Sarandon
Libérer: 2024-12-31 20:01:14
original
905 Les gens l'ont consulté

How Can I Efficiently Get a Random Subset from a Collection Using LINQ?

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];
        }
    }
}
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal