← Все вопросы

Что значит x => x в C#? Не понимаю синтаксис лямбда-выражений

Задан 17 месяцев назад1.1к просмотров2 ответа
9

Везде в примерах с LINQ вижу странную стрелочку: x => x.Length, (a, b) => a + b, () => Console.WriteLine(...). Это называется лямбда-выражение, но я вообще не понимаю, как это читать. Что слева от =>, что справа, откуда берётся x?

Вот такая строка ставит меня в тупик:

var words = new[] { "кот", "собака", "ёж" };
var lengths = words.Select(w => w.Length);

Откуда взялась w? Я её нигде не объявлял. И почему иногда скобки есть, а иногда нет?

2 ответа

15
✓ Принятый ответ — помог автору

Лямбда — это просто компактная запись метода без имени. Стрелка => читается как «переходит в» / «возвращает». Слева — параметры, справа — тело.

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 писать не надо.

5

Полезно держать в голове, что лямбда — это значение делегата. Ту же w => w.Length можно положить в переменную типа Func:

Func<string, int> getLen = w => w.Length;
Console.WriteLine(getLen("привет")); // 6

То есть Select(w => w.Length) — это «передай в Select вот эту маленькую функцию». Как только ты увидишь в этом обычный метод, просто записанный коротко, всё встанет на места.

Ваш ответ

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