Обратите особое внимание в этой программе на следующий код запроса.
var ItAvg = from n in nums
let x = nums.Average where n < x select n;
Как видите, переменнойxв оператореletприсваивается среднее всех значений в массивеnums.Это значение получается в результате вызова методаAverage для массиваnums.
Режимы выполнения запросов: отложенный и немедленный
В LINQ запросы выполняются в двух разных режимах: немедленном и отложенном. Как пояснялось ранее в этой главе, при формировании запроса определяется ряд правил, которые не выполняются вплоть до оператора циклаforeach.Это так называемое
Но если используются методы расширения, дающие результат, отличающийся от последовательности, то запрос должен быть выполнен для получения этого результата. Рассмотрим, например, метод расширенияCount . Для того чтобы этот метод возвратил количество элементов в последовательности, необходимо выполнить запрос, и это делается автоматически при вызове методаCount . В этом случае имеет место
Ниже приведен простой пример программы для получения количества положительных элементов, содержащихся в последовательности.
using System.Linq;
class ImmediateExec { static void Main {
int[] nums = { 1,
// Сформировать запрос на получение количества // положительных значений в массиве nums. int len = (from n in nums where n > 0 select n).Count;
Console.WriteLine("Количество положительных значений в массиве nums: " + len) ;
}
}
Эта программа дает следующий результат.
Количество положительных значений в массиве nums: 3
Обратите внимание на то, что циклforeachне указан в данной программе явным образом. Вместо этого запрос выполняется автоматически благодаря вызову метода расширенияCount .
Любопытно, что запрос из приведенной выше программы можно было бы сформировать и следующим образом.
var posNums = from n in nums where n > 0 select n;
int len = posNums.Count; // запрос выполняется здесь
В данном случае методCount вызывается для переменной запроса. И в этот момент запрос выполняется для получения подсчитанного количества.