Главная » C# » Лямбда-выражения в Visual C# (Sharp)

0

Теперь мы готовы рассмотреть решение проблемы этой главы с помощью лямбдыражений, в основе которых лежат те же идеи, что и для анонимных методов. Дее приводится код примера для вычисления текущей суммы и максимального знения, модифицированный с использованием лямбда-выражений:

public static class Extensions {

public static void Iterate(this ICollection<int> collection,

Func<int, bool> lambda) {

foreach (int element in collection) { lambda(element);

}

}

}

static class Tests {

static void DoRunningTotalAndMaximum() { List<int> 1st = new List<int> { 1, 2, 3, 4 }; int runningTotal = 0;

1st.Iterate(

(value) => { runningTotal += value; return true;

>);

Console.WriteLine("Running total is (" + runningTotal + ")");

int maxValue = int.MinValue; 1st.Iterate(

(value) => {

if (value > marfValue) { maxValue = value;

}

return true;

});

Console.WriteLine("Maximum value is (" + maxValue + ")");

}

public static void RunAll() { DoRunningTotalAndMaximum();

}

}

Жирным шрифтом выделен измененный код примера, использующего анонимный метод. Первым основным отличием кода с применением лямбда-выражений явлтся отсутствие необходимости определять делегаты, т. к. они уже предопределы. Рассмотрим следующее объявление;

Funccint, bool> MyMethod;

Здесь объявляется метод с параметром  int и возвращаемым значением типа bool.

Данный метод выглядит таким образом:

bool MyMethod(int value) { return false; }

Интерфейс API .NET позволяет определять одинаковым образом методы, принающие до пяти параметров. Если бы нам был нужен метод с пятью параметрами, то определенный метод имел бы шесть общих параметров .NET — последний паметр указывал бы тип возвращаемого методом значения:

Funccint, int, bool, int, int, bool> FiveArgs;

А если бы нам был нужен метод совсем без параметров, то определенный  метод имел бы один общий параметр .NET, указывающий тип возвращаемого методом значения:

Func<bool> NoArgs;

Объявлять  идентификатор  делегата  не  обязательно,  т. к.,  используя  обобщения

.NET и объявления делегатов, можно определить любую требуемую комбинацию объявлений методов. Единственным невозможным объявлением метода является метод делегата без параметров и без возвращаемого типа.

ПРИМЕЧАНИЕ

Чтобы определить Func () без  возвращаемого  типа,  нужно  определить  явный  делат,  например void Func ( ) .  Но лямбда-выражения можно продолжать использовать, т.  к.  компилятор С# подстроится  под ситуацию и подберет соответствующий код.

Теперь посмотрим на лямбда-выражение в коде, заменившем анонимный метод, который реализует сигнатуру делегата, состоящую из параметра int и возвращаого типа bool.

(value) => { runningTotal += value; return true;

}) ;

В лямбда-выражении отсутствует ключевое слово delegate или идентификатор делегата. В ключевом слове и идентификаторе нет надобности по той причине, что они подразумеваются, т. к. лямбда-выражение является анонимным методом. Паметры лямбда-выражения определяются в круглых скобках, но их тип не указается. Информация о типе параметров не требуется по той причине, что она поазумевается на основе объявления метода iterate*). Мы знаем, что значение параметра имеет тип int, т. к. в противном случае метод iterate о не скомпиловался бы.

Символы => отделяют объявление параметра от реализации метода. Хотя в приме применяются круглые и фигурные скобки, лямбда-выражения можно объявлять без скобок. В таком случае символы => неявно указывают, что далее следует вырение. Фигурные скобки, как и в других типах исходного когда С#, подразумевают блок исполняемого кода.

Давайте еще раз посмотрим на идентичный анонимный метод:

new ProcessValue* delegate(int value) {

runningTotal += value;

}

) ;

Анонимной метод, с его ключевым словом new, переменной ProcessValue и идеификатором delegate, имеет довольно многословный синтаксис, который не давляет ничего в действительности значимого. Лично я при реализации анонимных методов постоянно считаю скобки, чтобы их было правильное количество. Сравне это с компактным и легко читаемым лямбда-выражением. Преимущество пледнего очевидно.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии