Программирование >>  Программирование с использованием ajax 

1 ... 267 268 269 [ 270 ] 271 272 273 ... 396


foreach (var item in queryResults) {

Console.WriteLine(item) ;

Console.Write( Программа завершена, нажмите Enter для продолжения: ); Console.ReadLine() ;

3. Добавьте следующий метод для генерации списка случайных чисел:

private static int[] generateLotsOfNumbers(int count) {

Random generator = new Random(0); int[] result = new int[count]; for (int i = 0; i < count; i + + ) {

result [i] = generator.Next 0;

return result;

4. Откомпилируйте и запустите программу. Вы увидите список чисел меньше 1000, как показано ниже:

Числа меньше 1000:

Программа завершена, нажмите Enter для продолжения:

Описание полученных результатов

Как и ранее, первый шаг - это ссылка на пространство имен System.Linq, которая выполняется автоматически Visual С# 2008 при создании проекта:

using System.Linq;

Следующий шаг - генерация некоторых данных, которая осуществляется в этом примере вызовом метода generateLotsOfNumbers ():

int[] numbers = generateLotsOfNumbers(12345678); private static int[] generateLotsOfNumbers(int count) {

Random generator = new Random(0); int[] result = new int[count]; for (int i = 0; i < count; i++) {

result [i] = generator.Next 0;

return result;

Это не тривиальный набор данных - в массиве 12 миллионов чисел! В одном из упражнений в конце этой главы вы измените параметр size, передаваемый методу generateLotsOfNumbers () для генерации произвольного размера наборов случайных чисел, чтобы увидеть, как это влияет на результаты запроса. Как вы увидите, выполняя упражнение, размер, указанный здесь, 12 345 678, достаточно велик для получения



некоторых случайных чисел меньше 1000, чтобы получить результаты для демонстрации первого запроса.

Значения должны быть равномерно распределены по диапазону целых со знаком (от нуля до более чем 2 миллиарда). Создав генератор случайных чисел с начальным значением О, вы гарантируете генерацию одной и той же последовательности случайных чисел каждый раз, так что получите один и тот же результат запроса, показанный здесь, но каким именно будет этот результат - не знает никто, пока запрос не будет выполнен. К счастью, LINQ делает эту задачу простой!

Сам оператор запроса подобен тому, что вы выполняли ранее с именами, и состоит в том, чтобы выбрать некоторые числа, отвечающие определенному условию (в данном случае - числа меньше 1000):

var queryResults = from n in numbers where n < 1000 select n

Конструкция orderby на этот раз не нужна и потребовала бы дополнительного времени на обработку (не слишком существенного в данном примере, но заметного, когда вы измените запрос в следующем примере).

Вы печатаете результаты запроса в операторе foreach, как и в предыдущем примере:

Console.WriteLine( Числа меньше 1000: ); foreach (var item in queryResults) { Console.WriteLine (item);

Опять-таки, здесь присутствует вывод на консоль и чтение символа для приостановки вывода:

Console.Write( Программа завершена, нажмите Enter для продолжения: ); Console.ReadLine();

Код паузы во всех последующий примерах один и тот же и мы не станем показывать его вновь и вновь.

В LINQ очень легко изменить условия запроса для представления различных характеристик набора данных. Однако в зависимости от того, насколько много результатов возвращает запрос, может оказаться бессмысленным вывод их всех каждый раз. В следующем разделе будет показано, какие агрегатные операции предлагает LINQ, чтобы справиться с этой проблемой.

Агрегатные операции

Часто запрос возвращает больше результатов, чем ожидалось. Например, если вы измените условие предыдущей программы запроса чисел, указав, что необходимы числа больше 1000, а не меньше 1000, результат окажется просто нескончаемым, и вам захочется прервать печать!

К счастью, LINQ предоставляет набор агрегатных операций, позволяющих анализировать результаты запроса, не выполняя цикл по всем результатам. Перечисленные в табл. 26.1 агрегатные операции чаще всего используются для набора числовых результатов, таких как результаты предыдущего запроса, и могут быть знакомы, если вы имели дело с языком запросов баз данных наподобие SQL.



Таблица 26.1. Агрегатные операции

Операция

Описание

Count 0

Подсчитывает количество результатов

Min()

Минимальное значение результатов

МахО

Максимальное значение результатов

Average()

Среднее значение числовых результатов

Sum()

Сумма всех числовых результатов

Есть и другие агрегатные операции, такие как Aggregate (), предназначенные для выполнения произвольного кода в манере, позволяющей самостоятельно кодировать агрегатную функцию. Однако это - тема для профессиональных разработчиков, и она выходит за рамки настоящей книги.

Поскольку агрегатные операции возвращают простой скалярный тип вместо последовательности результатов, их применение вызывает немедленное выполнение всего запроса вместо обычного отложенного выполнения запроса.

В следующем практическом занятии вы модифицируете большой числовой запрос из предыдущего примера и применяете агрегатные операции для исследования результирующего набора из версии больше чем этого запроса, используя LINQ.

Практическое занятие ЧиСЛОВЫе ЭГрегатные ОПерВЦИИ

Выполните следующие шаги для создания примера в Visual С# 2008.

L Вы можете либо модифицировать пример LargeNumberQuery, либо создать новый проект консольного приложения по имени 26-6-NumericAggregates в каталоге С:\BegVCSharp\Chapter2 6.

2. Как и ранее, когда вы создаете проект. Visual С# 2008 включает в Program.cs ссылку на пространство имен LINQ. Вам нужно лишь модифицировать метод Main О , как показано в следующем коде и в остальной части этого практического занятия. Как и с предыдущим примером, в этом запросе не используется конструкция orderby. Однако условие конструкции where противоположно предыдущему примеру (числа должны быть больше 1000, а не меньше, как ранее), static void Main(string [ ] args) {

int[] numbers = generateLotsOfNumbers(12345678);

Console.WriteLine( Числовые агрегаты );

var queryResults = from n in numbers where n > 1000

select n

Console.WriteLine ( Количество чисел > 1000 ) ; Console.WriteLine(queryResults.Count());

Console.WriteLine ( Максимальное из чисел > 1000 ) ; Console .WriteLine (queryResults .Max ()) ;

Console.WriteLine ( Минимальное из чисел > 1000 ) ; Console .WriteLine (queryResults .Miji ()) ;



1 ... 267 268 269 [ 270 ] 271 272 273 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика