Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Лямбда-выражения22

Лямбда-выражение — это анонимная функция, которая содержит выражения и операторы и может использоваться для создания делегатов или типов дерева выражений.

Во всех лямбда-выражениях используется лямбда-оператор =>, который читается как "переходит в". Левая часть лямбда-оператора определяет параметры ввода (если таковые имеются), а правая часть содержит выражение или блок оператора. Лямбда-выражение x => x * x читается как "x переходит в x x раз". Это выражение может быть назначено типу делегата следующим образом:

---

Создание типа дерева выражений

---

Оператор => имеет тот же приоритет, что и оператор присваивания (=) и является правоассоциативным.

Лямбда-операторы используются в запросах LINQ на основе методов в качестве аргументов стандартных методов операторов запроса, таких как Where и Where(IQueryable, String, array<Object>[]()[]).

При использовании синтаксиса на основе методов для вызова метода Where в классе Enumerable (как это делается в LINQ на объекты и LINQ to XML) параметром является тип делегата System..::.Func<(Of <(T, TResult>)>). Лямбда-выражение — это наиболее удобный способ создания делегата. При вызове такого же метода, к примеру, в классе System.Linq..::.Queryable (как это делается в LINQ to SQL) типом параметра будет System.Linq.Expressions..::.Expression<Func>, где Func — это любые делегаты Func с числом параметров ввода не более пяти. Опять же, лямбда-выражения представляют собой самый быстрый способ построения дерева выражений. Лямбда-операторы позволяют вызовам Where выглядеть одинаково, хотя на самом деле объект, созданный из лямбда-выражения, имеет другой тип.

Обратите внимание: в приведенном выше примере подпись делегата имеет один неявный параметр ввода типа int и возвращает значение типа int. Лямбда-выражение можно преобразовать в делегат соответствующего типа, поскольку он также имеет один параметр ввода (x) и возвращает значение, которое компилятор может неявно преобразовать в тип int. (Вывод типа более подробно рассматривается в следующих разделах.) Делегат, вызываемый посредством параметра ввода 5, возвращает результат 25.

Лямбда-операторы не разрешены с левой стороны оператора is или as.

Expression Lambdas

A lambda expression with an expression on the right side is called an expression lambda. Expression lambdas are used extensively in the construction of Expression Trees. An expression lambda returns the result of the expression and takes the following basic form:

(input parameters) => expression

The parentheses are optional only if the lambda has one input parameter; otherwise they are required. Two or more input parameters are separated by commas enclosed in parentheses:

(x, y) => x == y

Sometimes it is difficult or impossible for the compiler to infer the input types. When this occurs, you can specify the types explicitly as shown in the following example:

(int x, string s) => s.Length > x

Specify zero input parameters with empty parentheses:

() => SomeMethod()

Note in the previous example that the body of an expression lambda can consist of a method call. However, if you are creating expression trees that will be consumed in another domain, such as SQL Server, you should not use method calls in lambda expressions. The methods will have no meaning outside the context of the .NET common language runtime.