Что значит x => x в C#? Не понимаю синтаксис лямбда-выражений
Везде в примерах с LINQ вижу странную стрелочку: x => x.Length, (a, b) => a + b, () => Console.WriteLine(...). Это называется лямбда-выражение, но я вообще не понимаю, как это читать. Что слева от =>, что справа, откуда берётся x?
Вот такая строка ставит меня в тупик:
var words = new[] { "кот", "собака", "ёж" };
var lengths = words.Select(w => w.Length);
Откуда взялась w? Я её нигде не объявлял. И почему иногда скобки есть, а иногда нет?
2 ответа
Лямбда — это просто компактная запись метода без имени. Стрелка => читается как «переходит в» / «возвращает». Слева — параметры, справа — тело.
w => w.Length означает: «возьми параметр w и верни w.Length». Это полный эквивалент такого метода:
int GetLength(string w)
{
return w.Length;
}
Про твоё «откуда взялась w»: её передаёт сам Select. Он перебирает коллекцию и на каждый элемент вызывает твою лямбду, подставляя элемент в w. Имя ты придумываешь сам — можно w, можно word, можно x.
Правила про скобки:
x => x * 2 // один параметр — скобки можно опустить
(x, y) => x + y // несколько параметров — скобки обязательны
() => 42 // нет параметров — пустые скобки
x => { return x * 2; } // тело из нескольких строк — фигурные скобки + return
Тип параметра компилятор выводит сам из контекста, поэтому string w писать не надо.
Полезно держать в голове, что лямбда — это значение делегата. Ту же w => w.Length можно положить в переменную типа Func:
Func<string, int> getLen = w => w.Length;
Console.WriteLine(getLen("привет")); // 6
То есть Select(w => w.Length) — это «передай в Select вот эту маленькую функцию». Как только ты увидишь в этом обычный метод, просто записанный коротко, всё встанет на места.