Стандартные операторы запроса с LINQ - Лямбда-выражения

ОГЛАВЛЕНИЕ

Лямбда-выражения

Многие стандартные операторы для обработки отдельных элементов последовательности используют делегаты Func. Лямбда-выражения могут использоваться совместно со стандартными операторами запросов для представления делегатов. Лямбда-выражение — это сокращенный вариант реализации делегата, и использовать их можно везде, где можно использовать анонимные делегаты. Лямбда-выражения поддерживаются и в C#, и в Visual Basic® .NET. Здесь нужно отметить, что поскольку Visual Basic .NET не позволяет применять анонимные методы, в этой платформе лямбда-выражения могут состояить только из одного выражения.

Рассмотрим порядок применения оператора Single к массиву целых чисел. Создадим массив, каждый элементо которого представляет собой степень двойки (от 1 до 10). Оператор Single будет использоваться для получения элемента, удовлетворяющего условиям, заданным в лямбда-выражении:

int[] nums = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 };
int singleNum = nums.Single(x => x > 16 && x < 64);
Console.WriteLine(singleNum.ToString());

Лямбда-выражение состоит из нескольких важных частей. Начинается оно с определения переменной, передаваемой в делегат. В нашем примере переменная x (объявленная слева от оператора =>) является аргуметом, представляющим передаваемый элемент массива. Остальная часть лямбда-выражения описывает логику оценки элементов. Такого же поведения можно добиться при помощи анонимного делегата:

int singleNum = nums.Single<int>(
  delegate(int x) {return (x > 16 && x < 64); }
);

Недостаток такого кода в том, что его труднее воспринимать, чем код с использованием лямбда-выражений. С появлением C# 2.0 анонимных делегатов передача делегатов упростилась, однако лямбда-выражения, благодаря компактному синтаксису, сделали ее просто элементарной.