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

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

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

Применение вложенных операторов from

Запрос может состоять из нескольких операторов fгom от, которые оказываются в этом случае вложенными. Такие операторы from находят применение в тех случаях, когда по запросу требуется получить данные из двух разных источников. Рассмотрим простой пример, в котором два вложенных оператора from используются в запросе для циклического обращения к элементам двух разных массивов символов. В итоге по такому запросу формируется последовательность результатов, содержащая все возможные комбинации двух наборов символов.

// Использовать два вложенных оператора from для составления списка

// всех возможных сочетаний букв А, В и С с буквами X, Y и Z.

using System;

using System.Linq;

// Этот класс содержит результат запроса,

class ChrPair {

  public char First;

  public char Second;

  public ChrPair(char c, char c2) {

    First = c;

    Second = c2;

  }

}

class MultipleFroms {

  static void Main() {

    char[] chrs = { 'A', 'В', 'C' };

    char[] chrs2 = { 'X', 'Y', 'Z' };

    // В первом операторе from организуется циклическое обращение

    //к массиву символов chrs, а во втором операторе from —

    // циклическое обращение к массиву символов chrs2.

    var pairs = from ch1 in chrs

                  from ch2 in chrs2

                    select new ChrPair(ch1, ch2);

    Console.WriteLine("Все сочетания букв ABC и XYZ: ");

    foreach(var p in pairs)

      Console.WriteLine("{0} {1}", p.First, p.Second);

  }

}

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

Все сочетания букв ABC и XYZ:

А X

A Y

A Z

В X

В Y

В Z

С X

С Y

С Z

Этот пример кода начинается с создания класса ChrPair, в котором содержатся результаты запроса. Затем в нем создаются два массива, chrs и chrs2, и, наконец, формируется следующий запрос для получения всех возможных комбинаций двух последовательностей результатов.

var pairs = from ch1 in chrs

  from ch2 in chrs2

select new ChrPair(ch1, ch2);

Во вложенных операторах from организуется циклическое обращение к обоим массивам символов, chrs и chrs2. Сначала из массива chrs получается символ, сохраняемый в переменной ch1. Затем перечисляется содержимое массива chrs2. На каждом шаге циклического обращения во внутреннем операторе from символ из массива chrs2 сохраняется в переменной ch2 и далее выполняется оператор select. В результате выполнения оператора select создается новый объект типа ChrPair, содержащий пару символов, которые сохраняются в переменных ch1 и ch2 на каждом шаге циклического обращения к массиву во внутреннем операторе from. А в конечном итоге получается объект типа ChrPair, содержащий все возможные сочетания извлекаемых символов.

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

Группирование результатов с помощью оператора group

Одним из самых эффективных средств формирования запроса является оператор group, поскольку он позволяет группировать полученные результаты по ключам. Используя последовательность сгруппированных результатов, можно без особого труда получить доступ ко всем данным, связанным с ключом. Благодаря этому свойству оператора group доступ к данным, организованным в последовательности связанных элементов, осуществляется просто и эффективно. Оператор group является одним из двух операторов, которыми может оканчиваться запрос. (Вторым оператором, завершающим запрос, является select.) Ниже приведена общая форма оператора group.

group переменная_диапазона by ключ

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

Результатом выполнения оператора group является последовательность, состоящая из элементов типа IGrouping<TKey, TElement>, т.е. обобщенного интерфейса, объявляемого в пространстве имен System.Linq. В этом интерфейсе определена коллекция объектов с общим ключом. Типом переменной запроса, возвращающего группу, является IEnumerable<IGrouping<TKey, TElement>>. В интерфейсе IGrouping определено также доступное только для чтения свойство Key, возвращающее ключ, связанный с каждой коллекцией.

Ниже приведен пример, демонстрирующий применение оператора group. В коде этого примера сначала объявляется массив, содержащий список веб-сайтов, а затем формируется запрос, в котором этот список группируется по имени домена самого верхнего уровня, например .org или .соm.

// Продемонстрировать применение оператора group.

using System;

using System.Linq;

class GroupDemo {

  static void Main() {

    string[] websites = { "hsNameA.com", "hsNameB.net",

          "hsNameC.net", "hsNameD.com", "hsNameE.org",

          "hsNameF.org", "hsNameG.tv",

          "hsNameH.net", "hsNamel.tv"

    };

    // Сформировать запрос на получение списка веб-сайтов,

    // группируемых по имени домена самого верхнего уровня.

    var webAddrs = from addr in websites

             where addr.LastIndexOf('.') != -1

             group addr by addr.Substring(addr.LastIndexOf('.'));

    // Выполнить запрос и вывести его результаты,

    foreach(var sites in webAddrs) {

      Console.WriteLine("Веб-сайты, сгруппированные " +

             "по имени домена" + sites.Key);

      foreach(var site in sites)

        Console.WriteLine (" " + site);

      Console.WriteLine();

    }

  }

}

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

Веб-сайты, сгруппированные по имени домена .соm

hsNameA.соm

hsNameD.соm

Веб-сайты, сгруппированные по имени домена .net

hsNameB.net

hsNameC.net

hsNameH.net

Веб-сайты, сгруппированные по имени домена .org

hsNameE.org

hsNameF.org

Веб-сайты, сгруппированные по имени домена .tv

hsNameG.tv

hsNamel.tv

Как следует из приведенного выше результата, данные, получаемые по запросу, группируются по имени домена самого верхнего уровня в адресе веб-сайта. Обратите внимание на то, как это делается в операторе group из следующего запроса.

var webAddrs = from addr in websites

        where addr.LastIndexOf('.') != -1

        group addr by addr.Substring(addr.LastIndexOf('.'));

Ключ в этом операторе создается с помощью методов LastIndexOf() и Substring(), определенных для данных типа string. (Эти методы упоминаются в главе 7, посвященной массивам и строкам. Вариант метода Substring(), используемый в данном примере, возвращает подстроку, начинающуюся с места, обозначаемого индексом, и продолжающуюся до конца вызывающей строки.) Индекс последней точки в адресе веб-сайта определяется с помощью метода LastIndexOf(). По этому индексу в методе Substring() создается оставшаяся часть строки, в которой содержится имя домена самого верхнего уровня. Обратите внимание на то, что в операторе where отсеиваются все строки, которые не содержат точку. Метод LastIndexOf() возвращает -1, если указанная подстрока не содержится в вызывающей строке.

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

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

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


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

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


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

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

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


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