Looking for c# Keywords? Try Ask4Keywords

C# Language Создайте собственные операторы Linq для IEnumerable


пример

Одна из замечательных особенностей Linq заключается в том, что ее так легко расширить. Вам просто нужно создать метод расширения , аргументом которого является 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;
        }
    }
}

Этот пример разбивает элементы в IEnumerable<T> на списки фиксированного размера, последний список содержит оставшиеся элементы. Обратите внимание, как объект, к которому применяется метод расширения, передается в ( source аргумента) в качестве исходного аргумента с использованием this ключевого слова. Затем ключевое слово yield используется для вывода следующего элемента в выходном IEnumerable<T> прежде чем продолжить выполнение с этой точки (см. Ключевое слово yield ).

Этот пример будет использоваться в вашем коде следующим образом:

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

В первом цикле подписок будет {2, 3, 4} и вторым {5, 6} .

Пользовательские методы LinQ можно комбинировать со стандартными методами LinQ. например:

//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

Этот запрос вернет четные числа, сгруппированные партиями с размером 3: {0, 2, 4}, {6, 8, 10}, {12}

Помните, что вам нужно using MyNamespace; чтобы получить доступ к методу расширения.