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

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


Console.WriteLine( Среднее иэ чисел > 1000 ); Console.WriteLine(queryResults.Average());

Console.WriteLine ( Сумма чисел > 1000 ) ;

Console .WriteLine (queryResults. 8гш1(п => (long) n)) ;

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

3. Если его еще нет, добавьте тот же метод generateLotsOfNumbers(), использованный в предыдущем примере:

private static int[] generateLotsOfNumbers(int count) {

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

result[i] = generator.Next 0;

return result;

4. Откомпилируйте и выполните пример. Вы увидите значения количества чисел, удовлетворяющих условию where, минимальное, максимальное и среднее их значение, как показано ниже:

Числовые агрегаты Количество чисел > 1000 12345671

Максимальное из чисел > 1000 2147483591

Минимальное из чисел > 1000 1034

Среднее из чисел > 1000 1073643807.50298 Сумма чисел > 1000 13254853218619179

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

Этот запрос производит намного больше результатов, чем в предыдущем примере (более 12 миллиардов). Использование orderby на таком большом результирующем наборе определенно пагубно скажется на производительности! Самое большое число в результирующем наборе превышает значение в два миллиарда, а самое маленькое - чуть больше 1000, как и ожидалось. Среднее - около 1 миллиона - как раз находится около середины диапазона возможных значений. Похоже, функция Rand () генерирует равномерное распределение чисел.

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

Первая часть программы точно такая же, как и в предыдущем примере, со ссылкой на пространство имен System. Linq и использованием метода generateLotsOfNumbers () для генерации исходных данных:

int[] numbers = generateLotsOfNumbers(12345678);

Запрос - тот же самый, что и в предыдущем примере, за исключением того, что условие where изменено с меньше на больше :

var queryResults = from n in numbers where n > 1000

select n;



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

Рассмотрим применение каждой агрегатной операции:

□ Count О:

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

Count () возвращает количество строк в результате запроса, в данном случае -

12 345 671 строк.

□ Мах():

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

Мах () возвращает максимальное значение в результатах запроса, в данном случае - число больше 2 миллиардов: 2 147 483 591, что очень близко к максимальному значению типа int (int .MaxValue, или 2 147 483 647).

□ Min():

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

Min () возвращает минимальное значение в результатах запроса, в данном случае- 1034.

□ Average О:

Console.WriteLine( Среднее из чисел > 1000 ); Console.WriteLine(queryResults.Average());

Average () возвращает среднее значение из результатов запроса, которым в данном случае является 1073643807.50298 - значение, очень близкое к середине диапазона возможных значений от 1000 до более 2 миллиардов. Это довольно бессмысленно для произвольного набора чисел, но демонстрирует возможности анализа результатов запроса. В последней части этой главы мы рассмотрим более полезное применение этих операций к некоторым бизнес-ориентированным данным.

а Sum():

Console.WriteLine( Сумма чисел > 1000 ); Console.WriteLine(queryResults.Sum(n => (long) n) ) ;

Обратите внимание, что вы передали лямбда-выражение п => (long) п методу Sum () для того, чтобы получить сумму всех чисел. Хотя Sum () не имеет перегрузок с другими параметрами, как Count (), Min (), Max () и т.д., использование этой версии вызова метода может привести к ошибке переполнения, потому что в результирующем наборе так много больших чисел, что их сумма может превысить значение, помещающееся в 32-битное целое, которое возвращает версия Sum () без параметров. Лямбда-выражение позволяет преобразовать результат Sum () в длинное 64-битное целое, которое нужно для хранения значения, превышающее 13 квадриллионов, не вызывая переполнения, а именно -

13 254 853 218 619 179, и лямбда-выражение позволяет легко выполнить такого рода поправку.



В дополнение к методу Count (), который возвращает 32-битное целое, LINQ также предусматривает метод LongCount (), возвращающий результат запроса в 64-битном целом. Однако это - специальный случай; все прочие операции требуют специального лямбда-выражения или вызова метода преобразования, если требуется 64-битная версия числа.

Запросы сложных объектов

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

Трактическое занятие ЗапрОС СЛОЖНЫХ объекТОВ

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

1. Создайте новое консольное приложение по имени 2 6-7-QueryComplexObjects в каталоге C:\BegVCSharp\Chapter26.

2. Прежде чем запустить класс Program в Program, cs, добавьте следующее краткое определение класса Customer:

class Customer {

public string ID { get; set; } public string City { get; set; } public string Country { get; set; } public string Region { get; set; } public decimal Sales { get; set; } public override string ToString () {

return ID: + ID + Город: + City + Страна: + Country + Регион: + Region + Продажи: + Sales;

3. Добавьте следующий код к методу Main () класса Program в Program, cs:

static void Main(string[] args) {

List < Customer > customers = new List < Customer > { new Customer { ID= A , City= New York , Country= USA ,

Region= North America , Sales=9999}, new Customer { ID= B , City= Mumbai , Country= India ,

Region= Asia , Sales=8888 }, new Customer { ID= C , City= Karachi , Country= Pakistan ,

Region= Asia , Sales=7777 }, new Customer { ID= D , City= Delhi , Country= India ,

Region= Asia , Sales=6666 }, new Customer { ID= E , City= S г о Paulo , Country= Brazil ,

Region= South America , Sales=5555 }, new Customer { ID= F , City= Moscow , Country= Russia ,

Region= Europe , Sales=4444 }, new Customer { ID= G , City= Seoul , Country= Korea , Region= Asia ,

Sales=3333 },



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

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