Maison > développement back-end > C++ > Quelle est l'approche LINQ optimale pour obtenir un sous-ensemble aléatoire ?

Quelle est l'approche LINQ optimale pour obtenir un sous-ensemble aléatoire ?

Barbara Streisand
Libérer: 2024-12-31 19:58:16
original
502 Les gens l'ont consulté

What's the Optimal LINQ Approach for Getting a Random Subset?

Extension LINQ optimale pour l'extraction aléatoire de sous-collections

Dans le monde de la programmation, il est souvent nécessaire d'extraire un sous-ensemble aléatoire d'une collection donnée. Pour les passionnés de LINQ, vous vous demandez peut-être quel est le moyen optimal d'y parvenir.

Une approche consiste à utiliser la méthode d'extension .Shuffle(), qui effectue le mélange Fisher-Yates-Durstenfeld. Cette méthode randomise efficacement l'ordre des éléments dans une collection, ce qui en fait une solution idéale pour créer une sous-collection aléatoire.

Pour illustrer son utilisation, supposons que vous ayez une collection nommée yourCollection avec N éléments et que vous souhaitiez extraire n éléments aléatoires où n <= N. Voici comment implémenter cela à l'aide de la méthode .Shuffle() :

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

Ce code mélange d'abord les éléments dans yourCollection en utilisant la méthode .Shuffle(). Il utilise ensuite la méthode .Take() pour extraire les n premiers éléments de la collection mélangée. Le résultat est une sous-collection aléatoire du nombre n.

Voici un exemple d'implémentation de la méthode d'extension .Shuffle() vous-même :

public static class EnumerableExtensions
{
    public static IEnumerable Shuffle(this IEnumerable source)
    {
        return source.Shuffle(new Random());
    }

    public static IEnumerable Shuffle(
        this IEnumerable 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 ShuffleIterator(
        this IEnumerable 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];
        }
    }
}

En utilisant cette méthode d'extension, vous pouvez facilement mélanger et extraire une sous-collection aléatoire de n'importe quelle taille à partir d'une requête LINQ. Cette technique offre une solution pratique et efficace pour une tâche courante de manipulation de données.

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