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

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

Читать бесплатно Герберт Шилдт - C# 4.0: полное руководство. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Рассмотрим другой пример. Но сначала приведем еще раз запрос из представленного ранее примера применения оператора 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;

Перейти на страницу:

Герберт Шилдт читать все книги автора по порядку

Герберт Шилдт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


C# 4.0: полное руководство отзывы

Отзывы читателей о книге C# 4.0: полное руководство, автор: Герберт Шилдт. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


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