Как написать собственный метод Where в C#

В C# можно написать собственный метод Where, который будет работать аналогично стандартному LINQ-методу. Для этого используется yield return и IEnumerable<T>.

Реализация метода Where

Метод должен принимать коллекцию и предикат — функцию, определяющую, какие элементы соответствуют условию.

public static class MyLinqExtensions
{
    public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)
    {
        foreach (var item in source)
        {
            if (predicate(item))
            {
                yield return item;
            }
        }
    }
}

Использование метода Where

После объявления расширяющего метода его можно применять так же, как стандартный Where.

var numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

foreach (var number in evenNumbers)
{
    Console.WriteLine(number); // 2, 4, 6
}

Как это работает

  1. Метод Where итерируется по коллекции source.
  2. Для каждого элемента выполняется переданный predicate.
  3. Если условие выполняется, элемент возвращается с yield return.
  4. Благодаря yield return метод выполняет отложенное вычисление — элементы извлекаются по мере необходимости.