Содержание
Лямбда-выражения — это ещё один способ создания анонимных методов. Для создания лямбда выражения используется специальный символ => слева от которого располагается список параметров, а справа — тело анонимного метода.
Пример использования лямбда-выражения
Вернемся к нашему примеру с делегатами:
delegate double Operation(double x, double y); delegate void EventHandler(string text);
и попробуем использовать для их создания лямбда-выражения:
Operation operation = (x, y) => x + y;
EventHandler handler = text => Console.WriteLine($"{text} - {operation(10,20)}");
handler("Сумма двух чисел");
Здесь делегату Operation соответствует лямбда-выражение:
(x, y) => x + y;
вычисляющее сумму двух чисел. При этом, обратите внимание, что для параметров выражения мы не указываем их тип. Второму делегату также соответствует лямбда-выражение:
text => Console.WriteLine($"{text} - {operation(10,20)}")
так как для делегата требуется всего один параметр (строка), то при определении лямбда-выражения мы опустили круглые скобки и просто указали слева от оператора единственный параметр (text). В коде второго выражения мы вызываем первый делегат для сложения чисел 10 и 20. В результате, в консоли мы увидим следующий вывод:
Лямбда-выражения в параметрах методов
Один из широко используемых вариантов использования лямбда-выражений — это их использование в параметрах методов. При этом, исходный код выглядит более выразительно, чем при использовании анонимных методов. Например, создадим вот такой класс:
public class Calculator
{
public double X { get; set; }
public double Y { get; set; }
public void Calculate(Operation operation)
{
Console.WriteLine(operation(X, Y));
}
public void Configure(Action configure)
{
configure(this);
}
}
public delegate void Action(Calculator calc);
public delegate double Operation(double x, double y);
У класса определено два автосвойства — X и Y, а также два метода — Calculate() и Configure(). Каждый из этих методов требует в качестве параметров свой делегат. Чтобы воспользоваться этим классом, мы можем использовать лямбда выражения следующим образом:
Calculator calculator = new Calculator();
calculator.Configure((calc) =>
{
calc.X = 10;
calc.Y = 20;
});
calculator.Calculate((a, b) => a + b);
calculator.Calculate((a, b) => a * b);
calculator.Calculate((a, b) => a / b);
При вызове calculator.Configure() используется лямбда выражение для настройки нашего калькулятора:
(calc) =>
{
calc.X = 10;
calc.Y = 20;
}
Далее мы трижды вызываем метод Calculate(), передавая в него каждый раз новое лямбда-выражение. В результате, вывод консоли будет следующим:
200
0,5
Кроме того, что лямбда-выражения могут выступать в качестве параметров методов, они также могут выступать и результатом какой-либо операции.
Лямбда-выражение как результат метода
Например, доработаем наш калькулятор следующим образом:
public class Calculator
{
public double X { get; set; }
public double Y { get; set; }
Operation? operation;
public void Calculate(OperationType type)
{
operation = SetOperation(type);
Console.WriteLine(operation(X, Y));
}
private static Operation SetOperation(OperationType type)
{
switch (type)
{
case OperationType.Add: return (x, y) => x + y;
case OperationType.Multiple: return (x, y) => x * y;
case OperationType.Divide: return (x, y) => x / y;
default: return (x, y) => (x + y);
}
}
public void Configure(Action configure)
{
configure(this);
}
}
Здесь приватный метод SetOperation() принимает в качестве параметра перечисление типа OperationType по значению которого возвращается делегат, причем в делегат преобразуется лямбда-выражение. Таким образом мы можем использовать объект нашего класса следующим образом:
Calculator calculator = new Calculator();
calculator.Configure((calc) =>
{
calc.X = 10;
calc.Y = 20;
});
calculator.Calculate(OperationType.Add);
calculator.Calculate(OperationType.Multiple);
calculator.Calculate(OperationType.Divide);
Вывод консоли будет таки же, как и в предыдущем примере
200
0,5
Итого
Лямбда-выражения представляют собой более лаконичный способ создания анонимных методов. Лямбда-выражения могут использовать параметры, возвращать результат, а также сами выступать в качестве результата выполнения какой-либо операции.