День сто тридцать восьмой. #ЗаметкиНаПолях

Лямбда-выражения. Продолжение

Лямбды операторов

Лямбда операторов напоминает лямбда-выражение, за исключением того, что оператор(ы) заключен(ы) в фигурные скобки:

(входные параметры) => {оператор;}

Тело оператора лямбда может состоять из любого числа операторов; однако на практике их обычно не более двух или трех:

Action<string> greet = name => 

{

string greeting = $"Hello {name}!";

Console.WriteLine(greeting);

};

greet("World");

// Вывод:

// Hello World!

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



Асинхронные лямбды

Вы можете легко создавать лямбда-выражения и операторы, которые включают асинхронную обработку, используя ключевые слова async и await. В следующем примере Windows Forms содержится обработчик событий, который вызывает и ожидает асинхронный метод SomeAsyncMethod:

public Form1()

{

InitializeComponent();

button1.Click += button1_Click;

}

private async void button1_Click(object sender, EventArgs e)

{

await SomeAsyncMethod();

}

private async Task SomeAsyncMethod(){…}

Обработчик нажатия на кнопку можно добавить с помощью асинхронной лямбды:

public Form1()

{

InitializeComponent();

button1.Click += async (sender, e) =>

{

await SomeAsyncMethod();

};

}



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

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

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

Func<(int, int, int), (int, int, int)> doubleThem = ns => (2 * ns.Item1, 2 * ns.Item2, 2 * ns.Item3);

var numbers = (2, 3, 4);

var doubles = doubleThem(numbers);

Console.WriteLine($"Кортеж чисел {numbers} удвоен: {doubles}");

// Вывод:

// Кортеж чисел (2, 3, 4) удвоен: (4, 6, 8)

Обычно поля кортежа называются Item1, Item2, и т.п. Но можно задать им имена:

Func<(int n1, int n2, int n3), (int, int, int)> doubleThem = ns => (2 * ns.n1, 2 * ns.n2, 2 * ns.n3);



Продолжение следует…



Источник: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions