Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Режимы выполнения запросов: отложенный и немедленный






В LINQ запросы выполняются в двух разных режимах: немедленном и отложенном. Как пояснялось ранее в этой главе, при формировании запроса определяется ряд пра­ вил, которые не выполняются вплоть до оператора цикла foreach. Это так называе­ мое отложенное выполнение.

Но если используются методы расширения, дающие результат, отличающийся от последовательности, то запрос должен быть выполнен для получения этого результа­ та. Рассмотрим, например, метод расширения Count(). Для того чтобы этот метод возвратил количество элементов в последовательности, необходимо выполнить за­ прос, и это делается автоматически при вызове метода Count(). В этом случае имеет место немедленное выполнение, когда запрос выполняется автоматически для получения требуемого результата. Таким образом, запрос все равно выполняется, даже если он не используется явно в цикле foreach.

Ниже приведен простой пример программы для получения количества положи­ тельных элементов, содержащихся в последовательности.

// Использовать режим немедленного выполнения запроса.

using System;

using System.Linq;

 

class ImmediateExec {

static void Main() {

int[] nums = { 1, -2, 3, 0, -4, 5 };

 

// Сформировать запрос на получение количества

// положительных значений в массиве 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() вызывается для переменной запроса. И в этот мо­ мент запрос выполняется для получения подсчитанного количества.

К числу других методов расширения, вызывающих немедленное выполнение за­ проса, относятся методы ТоАrray() и ToList(). Оба этих метода расширения опре­ делены в классе Enumerable. Метод ToArray() возвращает результаты запроса в мас­ сиве, а метод ToList() — результаты запроса в форме коллекции List. (Подробнее о коллекциях речь пойдет в главе 25.) В обоих случаях для получения результатов вы­ полняется запрос. Например, в следующем фрагменте кода сначала получается массив результатов, сформированных по приведенному выше запросу в переменной posNums, а затем эти результаты выводятся на экран.

int[] pnums = posNum.ТоАrrау(); // запрос выполняется здесь

 

foreach(int i in pnums)

Console.Write(i + " ");

}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.