KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Герберт Шилдт, "C# 4.0: полное руководство" бесплатно, без регистрации.
Перейти на страницу:

Рассмотрим другой пример. Но сначала приведем еще раз запрос из представленного ранее примера применения оператора join.


var inStockList = from item in items

  join entry in statusList

    on item.ItemNumber equals entry.ItemNumber

  select new Temp(item.Name, entry.InStock);


По этому запросу формируется последовательность, состоящая из объектов, инкапсулирующих наименование товара и состояние его запасов на складе. Вся эта информация получается путем объединения двух источников данных: items и statusList. Ниже приведен переделанный вариант данного запроса, в котором вместо синтаксиса, предусмотренного в C# для запросов, используется метод запроса Join().


// Использовать метод запроса Join() для составления списка

// наименований товаров и состояния их запасов на складе,

var inStockList = items.Join(statusList,

                             kl => kl.ItemNumber,

                             k2 => k2.ItemNumber,

                        (kl, k2) => new Temp(kl.Name, k2.InStock) );


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


var inStockList = items.Join(statusList,

                            kl => kl.ItemNumber,

                            k2 => k2.ItemNumber,

                        (kl, k2) => new { kl.Name, k2.InStock} );


Синтаксис запросов и методы запроса

Как пояснялось в предыдущем разделе, запросы в C# можно формировать двумя способами, используя синтаксис запросов или методы запроса. Любопытно, что оба способа связаны друг с другом более тесно, чем кажется, глядя на исходный код программы. Дело в том, что синтаксис запросов компилируется в вызовы методов запроса. Поэтому код


where х < 10


будет преобразован компилятором в следующий вызов.


Where(х => х < 10)


Таким образом, оба способа формирования запросов в конечном итоге сходятся на одном и том же.

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


Дополнительные методы расширения, связанные с запросами

Помимо методов, соответствующих операторам запроса, поддерживаемым в С#, име-ется ряд других методов расширения, связанных с запросами и зачастую оказывающих помощь в формировании запросов. Эти методы предоставляются в среде .NET Framework и определены для интерфейса IEnumerable<T> в классе Enumerable. Ниже приведены наиболее часто используемые методы расширения, связанные с запросами. Многие из них могут перегружаться, поэтому они представлены лишь в самой общей форме.


Метод            Описание


All(predicate)   Возвращает логическое значение true,

                 если все элементы в последовательности

                 удовлетворяют условию, задаваемому параметром

                 predicate

Any(predicate)   Возвращает логическое значение true, если

                 любой элемент в последовательности удовлетворяет

                 условию, задаваемому параметром predicate

Average()        Возвращает среднее всех значений в числовой

                 последовательности

Contains(value)  Возвращает логическое значение true, если

                 в последовательности содержится указанный объект

Count()          Возвращает длину последовательности, т.е.

                 количество составляющих ее элементов

First()          Возвращает первый элемент в последовательности

Last()           Возвращает последний элемент в последовательности

Max()            Возвращает максимальное значение в

                 последовательности

Min()            Возвращает минимальное значение в

                 последовательности

Sum()            Возвращает сумму значений в числовой

                 последовательности


Метод Count() уже демонстрировался ранее в этой главе. А в следующей программе демонстрируются остальные методы расширения, связанные с запросами.


// Использовать ряд методов расширения, определенных в классе Enumerable.

using System;

using System.Linq;

class ExtMethods {

  static void Main() {

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


    Console.WriteLine("Минимальное значение равно " + nums.Min());

    Console.WriteLine("Максимальное значение равно " + nums.Max());

    Console.WriteLine("Первое значение равно " + nums.First());

    Console.WriteLine("Последнее значение равно " + nums.Last());

    Console.WriteLine("Суммарное значение равно " + nums.Sum());

    Console.WriteLine("Среднее значение равно " + nums.Average());

    if(nums.All(n => n > 0))

      Console.WriteLine("Все значения больше нуля.");

    if(nums.Any(n => (n % 2) == 0))

      Console.WriteLine("По крайней мере одно значение является четным.");

    if(nums.Contains(3))

      Console.WriteLine("Массив содержит значение 3.");

  }

}


Вот к какому результату приводит выполнение этой программы.


Минимальное значение равно 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

Значения меньше среднего: 1 2 4 3


Обратите особое внимание в этой программе на следующий код запроса.


var ItAvg = from n in nums

    let x = nums.Average()

    where n < x

    select n;

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*