Содержание
Лямбда-выражения — это ещё один способ создания анонимных методов. Для создания лямбда выражения используется специальный символ =>
слева от которого располагается список параметров, а справа — тело анонимного метода.
Пример использования лямбда-выражения
Вернемся к нашему примеру с делегатами:
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
Итого
Лямбда-выражения представляют собой более лаконичный способ создания анонимных методов. Лямбда-выражения могут использовать параметры, возвращать результат, а также сами выступать в качестве результата выполнения какой-либо операции.