C# Language Construisez vos propres opérateurs Linq pour IEnumerable


Exemple

L'un des avantages de Linq est qu'il est si facile à étendre. Il vous suffit de créer une méthode d'extension dont l'argument est IEnumerable<T> .

public namespace MyNamespace
{
    public static class LinqExtensions
    {
        public static IEnumerable<List<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
        {
            var batch = new List<T>();
            foreach (T item in source)
            {
                batch.Add(item);
                if (batch.Count == batchSize)
                {
                    yield return batch;
                    batch = new List<T>();
                }
            }
            if (batch.Count > 0)
                yield return batch;
        }
    }
}

Cet exemple divise les éléments dans un IEnumerable<T> en listes d'une taille fixe, la dernière liste contenant le reste des éléments. Notez que l'objet auquel la méthode d'extension est appliquée est passé (argument source ) comme argument initial à l'aide du mot this clé this . Ensuite, le mot-clé yield est utilisé pour générer l'élément suivant dans la sortie IEnumerable<T> avant de poursuivre l'exécution à partir de ce point (voir le mot-clé yield ).

Cet exemple serait utilisé dans votre code comme ceci:

//using MyNamespace;
var items = new List<int> { 2, 3, 4, 5, 6 };
foreach (List<int> sublist in items.Batch(3))
{
    // do something
}

Sur la première boucle, la sous-liste serait {2, 3, 4} et la seconde {5, 6} .

Les méthodes LinQ personnalisées peuvent également être combinées avec les méthodes LinQ standard. par exemple:

//using MyNamespace;
var result = Enumerable.Range(0, 13)         // generate a list
                       .Where(x => x%2 == 0) // filter the list or do something other
                       .Batch(3)             // call our extension method
                       .ToList()             // call other standard methods

Cette requête renvoie des nombres pairs regroupés en lots de taille 3: {0, 2, 4}, {6, 8, 10}, {12}

N'oubliez pas que vous avez besoin de using MyNamespace; ligne pour pouvoir accéder à la méthode d'extension.