// Создать список целочисленных значений.
List
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
// Вызвать FindAll() с применением традиционного синтаксиса делегатов.
Predicate
List
Console.WriteLine("Here are your even numbers:");
foreach (int evenNumber in evenNumbers)
{
Console.Write("{0}\t", evenNumber);
}
Console.WriteLine();
}
// Цель для делегата Predicate<>.
static bool IsEvenNumber(int i)
{
// Это четное число?
return (i % 2) == 0;
}
Здесь имеется метод (IsEvenNumber()
%) языка С#. Запуск приложения приводит к выводу на консоль чисел 20, 4, 8 и 44.Наряду с тем, что такой традиционный подход к работе с делегатами ведет себя ожидаемым образом, IsEvenNumber()
FindAll(), который возлагает на нас обязанность по полному определению метода. Если взамен использовать анонимный метод, то можно превратить это в локальную функцию и код станет значительно чище. Добавьте в класс Program следующий новый метод:static void AnonymousMethodSyntax()
{
// Создать список целочисленных значений.
List
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
// Теперь использовать анонимный метод.
List
list.FindAll(delegate(int i) { return (i % 2) == 0; } );
// Вывести четные числа
Console.WriteLine("Here are your even numbers:");
foreach (int evenNumber in evenNumbers)
{
Console.Write("{0}\t", evenNumber);
}
Console.WriteLine();
}
В данном случае вместо прямого создания объекта делегата Predicate
delegate (или строго типизированный класс Predicate) и обеспечивать точное соответствие списка параметров:List
delegate(int i)
{
return (i % 2) == 0;
}
);
Для еще большего упрощения вызова метода FindAll()
Program:static void LambdaExpressionSyntax()
{
// Создать список целочисленных значений.
List
list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
// Теперь использовать лямбда-выражение С #.
List
// Вывести четные числа.
Console.WriteLine("Here are your even numbers:");
foreach (int evenNumber in evenNumbers)
{
Console.Write("{0}\t", evenNumber);
}
Console.WriteLine();
}
Обратите внимание на довольно странный оператор кода, передаваемый методу FindAll()
Predicate (или ключевого слова delegate, если на то пошло). Должно указываться только лямбда-выражение:i => (i % 2) == 0