Ответ
Лямбда-выражение — это краткий синтаксис для определения анонимной функции (делегата или дерева выражений). Оно позволяет инлайново передавать код в качестве аргумента.
Синтаксис: (input-parameters) => expression-or-statement-block
1. Использование с делегатами Func<> и Action<>:
// Лямбда, возвращающая значение (соответствует Func<int, int>)
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 25
// Лямбда без возвращаемого значения (соответствует Action<string>)
Action<string> greet = name => Console.WriteLine($"Привет, {name}!");
greet("Анна");
// Лямбда с несколькими параметрами и телом в фигурных скобках
Func<int, int, int> sum = (a, b) =>
{
int result = a + b;
return result;
};
2. Практическое применение в LINQ и обработке коллекций:
var numbers = new List<int> { 1, 2, 3, 4, 5 };
// Фильтрация: где число четное
var evenNumbers = numbers.Where(n => n % 2 == 0); // [2, 4]
// Преобразование: умножить каждый элемент на 10
var multiplied = numbers.Select(x => x * 10); // [10, 20, 30, 40, 50]
// Сортировка: по убыванию
var sorted = numbers.OrderByDescending(n => n); // [5, 4, 3, 2, 1]
3. Захват переменных из внешней области видимости (closure):
int factor = 10;
// Лямбда "запоминает" значение factor на момент своего создания
Func<int, int> multiplier = n => n * factor;
Console.WriteLine(multiplier(3)); // 30
factor = 20; // Изменение factor НЕ влияет на захваченное значение в данном контексте.
Console.WriteLine(multiplier(3)); // 30 (используется захваченное значение 10)
// Важно: поведение может быть сложным с циклами и асинхронным кодом.
Почему это важно? Лямбды делают код более декларативным, читаемым и компактным, особенно при работе с коллекциями (LINQ), асинхронными операциями и обработкой событий.
Ответ 18+ 🔞
Слушай, ну вот объясняю тебе как для дебила, но ты не обижайся, я сам когда-то нихуя не понимал. Лямбда — это, по сути, короткий способ записи какой-нибудь мелкой функции, прямо там, где она нужна, не отходя от кассы.
Представь, что тебе надо сказать компу: «эй, для каждого числа в списке сделай вот это». Раньше надо было писать отдельный метод, имя ему придумывать, а потом на него ссылаться — заебешься, блядь. А теперь можно воткнуть действие прямо в строку, как втыкают замечание в споре.
Как это выглядит, ёпта:
Пишешь скобочки с параметрами (или без), потом стрелочку =>, а потом — что должно произойти. Всё, пиздец, готово.
// Вот тебе лямбда, которая берёт число 'x' и возвращает его квадрат.
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // Выведет 25, ебать ты математик!
// А это — лямбда, которая просто орёт в консоль. Ничего не возвращает.
Action<string> yell = name => Console.WriteLine($"Ну привет, {name}, долбоёб!");
yell("Василий");
Где это реально втыкают? Да везде, блядь! Особенно в LINQ.
Допустим, есть у тебя список чисел, и ты хочешь только чётные. Раньше бы писал цикл, а теперь:
var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Говоришь: "Отфильтруй мне числа, где остаток от деления на два — ноль".
var even = numbers.Where(n => n % 2 == 0); // [2, 4, 6, 8, 10]
Или хочешь каждое число умножить на десять, чтобы было красиво и кругло:
var multiplied = numbers.Select(x => x * 10); // [10, 20, 30 ... 100]
Красота же, да? В одну строку, нихуя лишнего.
А ещё они могут тащить за собой переменные снаружи, это пиздец как удобно и иногда опасно.
Смотри:
int multiplier = 5;
// Лямбда схватила эту переменную и держит, как собака кость.
Func<int, int> multiplyByFive = x => x * multiplier;
Console.WriteLine(multiplyByFive(3)); // 15, всё логично.
multiplier = 100; // А вот тут меняешь переменную снаружи...
// Но в лямбде уже лежало старое значение? Или новое? Вот тут надо головой думать, а не жопой.
// В данном простом случае она использует захваченную переменную, и если она ссылочного типа или в определённом контексте — может быть сюрприз, блядь.
// С асинхронным кодом или циклами вообще можно ебнуться, так что осторожнее.
Итог: Лямбды — это как матерные сокращения в речи. Вместо «иди на хуй, блядь, со своим мнением» можно сказать «иди нахуй» — суть та же, а быстрее и выразительнее. Используй их, когда нужно быстро описать простое действие, особенно в LINQ, и не выёбывайся со сложной логикой внутри — для этого есть нормальные методы.
Видео-ответы
▶
▶
▶
▶
▶
▶