Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
List<int> evenNumbers = list.FindAll( delegate(int i) { return (i % 2) == 0; });Для еще большего упрощения вызова метода
FindAll()Programstatic void LambdaExpressionSyntax(){ // Создать список целочисленных значений. List<int> list = new List<int>(); list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });<b> // Теперь использовать лямбда-выражение С #.</b> List<int> evenNumbers = list.FindAll(i => (i % 2) == 0); // Вывести четные числа. Console.WriteLine("Here are your even numbers:"); foreach (int evenNumber in evenNumbers) { Console.Write("{0}t", evenNumber); } Console.WriteLine();}Обратите внимание на довольно странный оператор кода, передаваемый методу
FindAll()Predicate<T>delegatei => (i % 2) == 0Перед разбором синтаксиса запомните, что лямбда-выражения могут использоваться везде, где должен применяться анонимный метод или строго типизированный делегат (обычно с клавиатурным набором гораздо меньшего объема). "За кулисами" компилятор C# транслирует лямбда-выражение в стандартный анонимный метод, использующий тип делегата
Predicate<T>ildasm.exe// Это лямбда-выражение... List<int> evenNumbers = list.FindAll(i => (i % 2) == 0); компилируется в приблизительно такой код С#:
// ...становится следующим анонимным методом. List<int> evenNumbers = list.FindAll(delegate (int i) { return (i % 2) == 0; }); Анализ лямбда-выражения
Лямбда-выражение начинается со списка параметров, за которым следует лексема
=>АргументыДляОбработки => ОбрабатывающиеОператоры
То, что находится внутри метода
LambdaExpressionSyntax()// i — список параметров.// (i % 2) == 0 - набор операторов для обработки iList<int> evenNumbers = list.FindAll(i => (i % 2) == 0);Параметры лямбда-выражения могут быть явно или неявно типизированными. В настоящий момент тип данных, представляющий параметр
ii// Теперь установим тип параметров явно.List<int> evenNumbers = list.FindAll((int i) => (i % 2) == 0);Как вы уже видели, если лямбда-выражение имеет одиночный неявно типизированный параметр, то круглые скобки в списке параметров могут быть опущены. Если вы желаете соблюдать согласованность относительно применения параметров лямбда-выражений, тогда можете всегда заключать в скобки список параметров:
List<int> evenNumbers = list.FindAll((i) => (i % 2) == 0);Наконец, обратите внимание, что в текущий момент выражение не заключено в круглые скобки (естественно, вычисление остатка от деления помещено в скобки, чтобы гарантировать его выполнение перед проверкой на равенство). В лямбда-выражениях разрешено заключать оператор в круглые скобки:
// Поместить в скобки и выражение.List<int> evenNumbers = list.FindAll((i) => ((i % 2) == 0));После ознакомления с разными способами построения лямбда-выражения давайте выясним, как его можно читать в понятных человеку терминах. Оставив чистую математику в стороне, можно привести следующее объяснение:
// Список параметров (в данном случае единственное целочисленное// значение по имени i) будет обработан выражением (i % 2) == 0.List<int> evenNumbers = list.FindAll((i) => ((i % 2) == 0));Обработка аргументов внутри множества операторов
Первое рассмотренное лямбда-выражение включало единственный оператор, который в итоге вычислялся в булевское значение. Однако, как вы знаете, многие цели делегатов должны выполнять несколько операторов кода. По этой причине язык C# позволяет строить лямбда-выражения, состоящие из множества операторов, указывая блок кода в стандартных фигурных скобках. Взгляните на приведенную далее модификацию метода
LambdaExpressionSyntax()Похожие книги на "Язык программирования C#9 и платформа .NET5", Троелсен Эндрю
Троелсен Эндрю читать все книги автора по порядку
Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mir-knigi.info.