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!");