Maison > développement back-end > C++ > Comment générer efficacement des sous-collections aléatoires à l'aide de LINQ ?

Comment générer efficacement des sous-collections aléatoires à l'aide de LINQ ?

Mary-Kate Olsen
Libérer: 2025-01-01 03:54:09
original
1027 Les gens l'ont consulté

How to Efficiently Generate Random Subcollections Using LINQ?

Requête LINQ optimale pour les sous-collections aléatoires : Shuffle

La génération d'une collection mélangée aléatoirement d'un nombre spécifique à partir d'une collection plus grande peut être réalisée de plusieurs manières en utilisant LINQ.

Une approche efficace consiste à utiliser l'algorithme de lecture aléatoire Fisher-Yates-Durstenfeld, qui peut être implémenté en tant que méthode d'extension dans LINQ :

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

Pour récupérer une sous-collection aléatoire de nombre 'n' à partir d'une collection d'éléments 'N', où n <= N, appliquez simplement Shuffle() méthode d'extension suivie de Take(n):

var randomItems = yourCollection.Shuffle().Take(n);
Copier après la connexion

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!

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