Герберт Шилдт - C# 4.0 полное руководство - 2011
- Название:C# 4.0 полное руководство - 2011
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0 полное руководство - 2011 краткое содержание
C# 4.0 полное руководство - 2011 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Вот к какому результату приводит выполнение этой программы.
Минимальное значение равно 1 Максимальное значение равно 5 Первое значение равно 3 Последнее значение равно 4 Суммарное значение равно 15 Среднее значение равно 3 Все значения больше нуля.
По крайней мере одно значение является четным Массив содержит значение 3.
Методы расширения, связанные с запросами, можно также использовать в самом запросе, основываясь на синтаксисе запросов, предусмотренном в С#. И в действительности это делается очень часто. Например, метод Average () используется в приведенной ниже программе для получения последовательности, состоящей только из тех значений, которые оказываются меньше среднего всех значений в массиве.
// Использовать метод Average() вместе с синтаксисом запросов.
using System; using System.Linq;
class ExtMethods2 { static void Main() {
int[] nums = { 1, 2, 4, 8, 6, 9, 10, 3, 6, 7 };
var ItAvg = from n in nums
let x = nums.Average() where n < x select n;
Console.WriteLine("Среднее значение равно " + nums.Average());
Console.Write("Значения меньше среднего: ");
// Выполнить запрос и вывести его результаты, foreach(int i in ItAvg) Console.Write(i + " ");
Console.WriteLine ();
}
}
При выполнении этой программы получается следующий результат.
Среднее значение равно 5.6 Значения меньше среднего: 12 4 3
Обратите особое внимание в этой программе на следующий код запроса.
var ItAvg = from n in nums
let x = nums.Average() where n < x select n;
Как видите, переменной x в операторе let присваивается среднее всех значений в массиве nums. Это значение получается в результате вызова метода Average () для массива nums.
Режимы выполнения запросов: отложенный и немедленный
В LINQ запросы выполняются в двух разных режимах: немедленном и отложенном. Как пояснялось ранее в этой главе, при формировании запроса определяется ряд правил, которые не выполняются вплоть до оператора цикла foreach. Это так называемое отложенное выполнение.
Но если используются методы расширения, дающие результат, отличающийся от последовательности, то запрос должен быть выполнен для получения этого результата. Рассмотрим, например, метод расширения Count () . Для того чтобы этот метод возвратил количество элементов в последовательности, необходимо выполнить запрос, и это делается автоматически при вызове метода Count () . В этом случае имеет место немедленное выполнение , когда запрос выполняется автоматически для получения требуемого результата. Таким образом, запрос все равно выполняется, даже если он не 1 используется явно в цикле foreach.
Ниже приведен простой пример программы для получения количества положительных элементов, содержащихся в последовательности.
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 () вызывается для переменной запроса. И в этот момент запрос выполняется для получения подсчитанного количества.
К числу других методов расширения, вызывающих немедленное выполнение запроса, относятся методы То 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. Они оказываются пригодными в тех случаях, когда запрос выполняется вне программы, например средствами SQL в базе данных. Если запрос представлен в виде данных, то его можно преобразовать в формат, понятный для базы данных. Этот процесс выполняется, например, средствами LINQ to SQL в интегрированной среде разработки Visual Studio. Таким образом, деревья выражений способствуют поддержке в C# различных баз данных.
Для получения исполняемой формы дерева выражений достаточно вызвать метод Compile () , определенный в классе Expression. Этот метод возвращает ссылку, которая может быть присвоена делегату для последующего выполнения. А тип делегата может быть объявлен собственным или же одним из предопределенных типов делегата Func в пространстве имен System. Две формы делегата Func уже упоминались ранее при рассмотрении методов запроса, но существует и другие его формы.
Деревьям выражений присуще следующее существенное ограничение: они могут представлять только одиночные лямбда-выражения. С их помощью нельзя представить блочные лямбда-выражения.
Интервал:
Закладка: