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

Лямбда-выражения — это ещё один способ создания анонимных методов. Для создания лямбда выражения используется специальный символ => слева от которого располагается список параметров, а справа — тело анонимного метода.

Пример использования лямбда-выражения

Вернемся к нашему примеру с делегатами:

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. В результате, в консоли мы увидим следующий вывод:

Сумма двух чисел — 30

Лямбда-выражения в параметрах методов

Один из широко используемых вариантов использования лямбда-выражений — это их использование в параметрах методов. При этом, исходный код выглядит более выразительно, чем при использовании анонимных методов. Например, создадим вот такой класс:

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(), передавая в него каждый раз новое лямбда-выражение. В результате, вывод консоли будет следующим:

30
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);

Вывод консоли будет таки же, как и в предыдущем примере

30
200
0,5

Итого

Лямбда-выражения представляют собой более лаконичный способ создания анонимных методов. Лямбда-выражения могут использовать параметры, возвращать результат, а также сами выступать в качестве результата выполнения какой-либо операции.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии