Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
static void LambdaExpressionSyntax()
{
// Создать список целочисленных значений.
List<int> list = new List<int>();
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
// Обработать каждый аргумент внутри группы операторов кода.
List<int> evenNumbers = list.FindAll((i) =>
{
// текущее значение i
Console.WriteLine("value of i is currently: {0}", i);
bool isEven = ((i % 2) == 0);
return isEven;
});
// Вывести четные числа
Console.WriteLine("Here are your even numbers:");
foreach (int evenNumber in evenNumbers)
{
Console.Write("{0}t", evenNumber);
}
Console.WriteLine();
}
В данном случае список параметров (опять состоящий из единственного целочисленного значения
i
Console.WriteLine()
Console.WriteLine("***** Fun with Lambdas *****n");
TraditionalDelegateSyntax();
AnonymousMethodSyntax();
Console.WriteLine();
LambdaExpressionSyntax();
Console.ReadLine();
Запуск приложения дает следующий вывод:
***** Fun with Lambdas *****
Here are your even numbers:
20 4 8 44
Here are your even numbers:
20 4 8 44
value of i is currently: 20
value of i is currently: 1
value of i is currently: 4
value of i is currently: 8
value of i is currently: 9
value of i is currently: 44
Here are your even numbers:
20 4 8 44
Лямбда-выражения с несколькими параметрами и без параметров
Показанные ранее лямбда-выражения обрабатывали единственный параметр. Тем не менее, это вовсе не обязательно, т.к. лямбда-выражения могут обрабатывать множество аргументов (или ни одного). Для демонстрации первого сценария с множеством аргументов добавьте показанную ниже версию класса
SimpleMath
public class SimpleMath
{
public delegate void MathMessage(string msg, int result);
private MathMessage _mmDelegate;
public void SetMathHandler(MathMessage target)
{
_mmDelegate = target;
}
public void Add(int x, int y)
{
_mmDelegate?.Invoke("Adding has completed!", x + y);
}
}
Обратите внимание, что делегат
MathMessage
// Зарегистрировать делегат как лямбда-выражение.
SimpleMath m = new SimpleMath();
m.SetMathHandler((msg, result) =>
{Console.WriteLine("Message: {0}, Result: {1}", msg, result);});
// Это приведет к выполнению лямбда-выражения.
m.Add(10, 10);
Console.ReadLine();
Здесь задействовано выведение типа, поскольку для простоты два параметра не были строго типизированы. Однако метод
SetMathHandler()
m.SetMathHandler((string msg, int result) =>
{Console.WriteLine("Message: {0}, Result: {1}", msg, result);});
Наконец, если лямбда-выражение применяется для взаимодействия с делегатом, который вообще не принимает параметров, то можно указать в качестве параметра пару пустых круглых скобок. Таким образом, предполагая, что определен приведенный далее тип делегата:
public delegate string VerySimpleDelegate();
вот как можно было бы обработать результат вызова:
// Выводит на консоль строку "Enjoy your string!".
VerySimpleDelegate d =
new VerySimpleDelegate( () => {return "Enjoy your string!";} );
Console.WriteLine(d());
Используя новый синтаксис выражений, предыдущую строку можно записать следующим образом:
VerySimpleDelegate d2 =
new VerySimpleDelegate(() => "Enjoy your string!");