К числу других методов расширения, вызывающих немедленное выполнение запроса, относятся методыТо Array иToList . Оба этих метода расширения определены в классеEnumerable.МетодToAtray возвращает результаты запроса в массиве, а методToList () — результаты запроса в форме коллекцииList.(Подробнее о коллекциях речь пойдет в главе 25.) В обоих случаях для получения результатов выполняется запрос. Например, в следующем фрагменте кода сначала получается массив результатов, сформированных по приведенному выше запросу в переменнойposNums,а затем эти результаты выводятся на экран.
int[] pnums = posNum.ToArray; // запрос выполняется здесь
foreach(int i in pnums)
Console.Write(i + " ");
}
Деревья выражений
Еще одним средством, связанным с LINQ, является
нельзя выполнить, но можно преобразовать в исполняемую форму. Деревья выражений инкапсулируются в классеSystem. Linq. Expressions . Expression
Для получения исполняемой формы дерева выражений достаточно вызвать методCompile , определенный в классеExpression.Этот метод возвращает ссылку, которая может быть присвоена делегату для последующего выполнения. А тип делегата может быть объявлен собственным или же одним из предопределенных типов делегатаFuncв пространстве именSystem.Две формы делегатаFuncуже упоминались ранее при рассмотрении методов запроса, но существует и другие его формы.
Деревьям выражений присуще следующее существенное ограничение: они могут представлять только одиночные лямбда-выражения. С их помощью нельзя представить блочные лямбда-выражения.
Ниже приведен пример программы, демонстрирующий конкретное применение дерева выражений. В этой программе сначала создается дерево выражений, данные которого представляют метод, определяющий, является ли одно целое число множителем другого. Затем это дерево выражений компилируется в исполняемый код. И наконец, в этой программе демонстрируется выполнение скомпилированного кода.
// Пример простого дерева выражений.
using System;
using System.Linq;
using System.Linq.Expressions;