Язык программирования C#9 и платформа .NET5. Страница 250
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();}В данном случае список параметров (опять состоящий из единственного целочисленного значения
iConsole.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 44Here are your even numbers:20 4 8 44value of i is currently: 20value of i is currently: 1value of i is currently: 4value of i is currently: 8value of i is currently: 9value of i is currently: 44Here are your even numbers:20 4 8 44 Лямбда-выражения с несколькими параметрами и без параметров
Показанные ранее лямбда-выражения обрабатывали единственный параметр. Тем не менее, это вовсе не обязательно, т.к. лямбда-выражения могут обрабатывать множество аргументов (или ни одного). Для демонстрации первого сценария с множеством аргументов добавьте показанную ниже версию класса
SimpleMathpublic 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!");