Лямбда-выражения были введены в C # 3 (.NET 3.5). Эти выражения используются сегодня повсеместно в коде, чтобы сделать запросы LINQ,чтобы сделать фильтры на списках, для делегатов и событий.
Поэтому очень важно понять, как работает этот тип выражения.
Лямбда-выражение-это анонимная функция, которая может содержать выражения и инструкции. Это можно использовать для создания делегатов или типов дерева выражений.
Во всех выражениях используется оператор lambda => (читает “приводит к”).
Выражение всегда состоит из двух частей:
левая сторона дает входные параметры (если таковые имеются),
сторона должна дать инструкции анонимного метода.
Лямбда-выражения используются двумя способами:
чтобы создать лямбда-выражение: это выражение, которое используется для создания деревьев выражений (в основном используется для выполнения инструкций динамически, идеально подходит для создания фильтров данных с Linq, например),
чтобы создать инструкции lambda: это эквивалент делегата в C # с другим синтаксисом.
Вот пример лямбда-выражения:
1 2 3 4 5 6 7 |
delegate int DelegateType(int i); public void Main() { DelegateType myDelegate = x => x*x; int square = myDelegate(5); // square is worth 25 } |
Вот пример лямбда-утверждения
1 2 3 4 5 6 7 |
delegate void DelegateInstruction(string s); public void Main() { DelegateInstruction myFunc = str => { Console.WriteLine("Entree = {0}", str); }; myFunc("Hello"); // displays "Entree = Hello" } |
Используйте лямбда-выражения каждый день
Платформа .NET framework предлагает множество методов, использующих лямбда-выражения через Тип Func.
Делегаты Func-это параметризованные делегаты, задающие тип ввода (T) и тип вывода (TResult).
Эти делегаты очень полезны для инкапсуляции определяемых пользователем выражений для применения к источнику данных.
Этот делегат определяется следующим образом:
1 |
public delegate TResult Func(TArg0 arg0) |
Повторяя предыдущий пример, что из расчета квадрата, можно написать этот кусок кода вместо этого:
1 2 3 4 5 |
public void Main() { Func<int,int> myDelegate = x => x*x; int square = myDelegate(5); // square vaut 25 } |
Ладно, это пример простой. Но давайте пойдем дальше. Платформа предлагает множество методов расширения с момента появления Linq.
Наиболее используемым, несомненно, является Count, который позволяет вернуть количество элементов коллекции.
Этот метод поддерживает несколько перегрузок, одна из которых предлагает параметр типа Func, что позволяет задать выражение фильтрации.
Благодаря этому механизму, в частности, можно рассчитывать на определенные элементы.
Вот такой пример :
1 2 3 4 5 |
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; public void Main() { int pairs = numbers .Count(n => n % 2 == 0); } |
Вот еще один пример использования метода Average:
1 2 3 4 |
//Returns the average of the numbers in the //list (each of which is greater than 5) int average= numbers.Average(n => n>5); |
Применение последовательных фильтров
Например, рассмотрим список элементов, которые мы хотим отфильтровать (например, список пользователей).
Лямбда-выражения позволяют применять к коллекциям несколько фильтров.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public void Main() { // delegate to keep only non-empty items Func filtreVide = s => !String.IsNullOrEmpty(s); // delegate to keep items that contain an "a" or "b" Func filtreLettres = s => s.Contains('a') || s.Contains('b'); List utilisateurs = new List(); utilisateurs.AddRange(new string[] { "", null, "pascal", "john" }); // 1st filter application IEnumerable resultat = utilisateurs.Where(filtreVide); // 2st filter application resultat = resultat.Where(filtreLettres); // result display foreach (var item in resultat) Console.WriteLine(item); } |
Вывод
Лямбда-выражения теперь широко используются в .NET framework. Без него практически невозможно обойтись (многие компоненты их используют).
Я предлагаю вам попробовать и использовать эти механизмы.
Чтобы пойти дальше, вы также можете узнать о деревьях выражений, которые могут быть использованы для создания скомпилированных методов на лету для вычисления выражений: см. веб-сайт Корпорации Майкрософт.