В 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
}
Как это работает
- Метод
Where
итерируется по коллекцииsource
. - Для каждого элемента выполняется переданный
predicate
. - Если условие выполняется, элемент возвращается с
yield return
. - Благодаря
yield return
метод выполняет отложенное вычисление — элементы извлекаются по мере необходимости.