Полное руководство по языку программирования С# 14 и платформе .NET 10 / LINQ

Делегаты в запросах LINQ

Начальный ⏱ 2 мин чтения 👁 2 🕓 обновлено 11.08.2026

Если мы обратимся к определению многих методов расширений LINQ, то увидим, что в качестве параметра многие из них принимают делегаты например, Func<TSource, bool>, например, определение метода Where:


public static IEnumerable<TSource> Where<TSource>(
	this IEnumerable<TSource> source,
	Func<TSource, bool> predicate
)

Хотя, как правило, в качестве делегата в подобные методы удобно передавать лямбда-выражения. Но тем не менее мы также можем передать полноценные методы. Например:


string[] people = { "Tom", "Bob", "Kate", "Tim", "Mike", "Sam" };

var result = people.Where(LenghtIs3);

foreach (var person in result)
    Console.WriteLine(person);

bool LenghtIs3(string name) => name.Length == 3;

Здесь метод LenghtIs3 проверяет, равна ли длина строки 3 символам. Так как в данном случае набор элементов, к которому применяется метод Where, содержит объекты string, то в метод в качестве параметра передается объект этого типа. Возвращаемый тип должен представлять тип bool: если true, то объект string соответствует условию и попадает в выходную коллекцию.

Рассмотрим другой пример. Пусть метод Select() применяется к коллекции целых чисел и преобразует каждое число в его квадрат:


int[] numbers = { -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 };

var result = numbers.Where(i => i > 0).Select(Square);

foreach (int i in result)
    Console.WriteLine(i);

int Square(int n) => n * n;

Метод Select в качестве параметра принимает тип Func<TSource, TResult> selector. Так как у нас набор объектов int, то входным параметром делегата также будет объект типа int. В качестве типа выходного параметра выберем int, так как здесь квадрат числа - это целочисленное значение.

Проверь себя

📋 Тест по теме «Делегаты в запросах LINQ» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

public static _____<TSource> Where<TSource>(
	this IEnumerable<TSource> source,
	Func<TSource, bool> predicate
)
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string[] people = { "_____", "Bob", "Kate", "Tim", "Mike", "Sam" };

var result = people.Where(LenghtIs3);

foreach (var person in result)
    Console.WriteLine(person);

bool LenghtIs3(string name) => name.Length == 3;
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

int[] numbers = { -2, -_____, 0, 1, 2, 3, 4, 5, 6, 7 };

var result = numbers.Where(i => i > 0).Select(Square);

foreach (int i in result)
    Console.WriteLine(i);

int Square(int n) => n * n;
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

public static IEnumerable<_____> Where<TSource>(
	this IEnumerable<TSource> source,
	Func<TSource, bool> predicate
)
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string[] people = { "Tom", "Bob", "Kate", "Tim", "Mike", "Sam" };

var _____ = people.Where(LenghtIs3);

foreach (var person in result)
    Console.WriteLine(person);

bool LenghtIs3(string name) => name.Length == 3;
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

public static _____<TSource> Where<TSource>(
	this IEnumerable<TSource> source,
	Func<TSource, _____> predicate
)
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

string[] people = { "Tom", "Bob", "Kate", "Tim", "Mike", "Sam" };

var result = people.Where(LenghtIs_____);

foreach (var person in result)
    Console._____(person);

bool LenghtIs3(string name) => name.Length == 3;
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

	this IEnumerable<TSource> source,
)
	Func<TSource, bool> predicate
public static IEnumerable<TSource> Where<TSource>(
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Делегаты в запросах LINQ»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Делегаты в запросах LINQ», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

public static IEnumerable<TSource> Where<TSource>(
	this IEnumerable<TSource> source,
	Func<TSource, bool> predicate
)
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Делегаты в запросах LINQ»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

string[] people = { "Tom", "Bob", "Kate", "Tim", "Mike", "Sam" };

var result = people.Where(LenghtIs3);

foreach (var person in result)
    Console.WriteLine(person);

bool LenghtIs3(string name) => name.Length == 3;
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Делегаты в запросах LINQ»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Делегаты в запросах LINQ»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Делегаты в запросах LINQ». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.