Что такое лямбда-выражение в C#?

Ответ

Лямбда-выражение — это краткий синтаксис для определения анонимной функции (делегата или дерева выражений). Оно позволяет инлайново передавать код в качестве аргумента.

Синтаксис: (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, и не выёбывайся со сложной логикой внутри — для этого есть нормальные методы.