Рейтинговые книги
Читем онлайн C# 4.0: полное руководство - Герберт Шилдт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 174 175 176 177 178 179 180 181 182 ... 294

Последовательность результатов, получаемых при выполнении запроса, хранящегося в переменной webAddrs, представляет собой список групп, поэтому для доступа к каждому члену группы требуются два цикла foreach. Доступ к каждой группе осуществляется во внешнем цикле, а члены внутри группы перечисляются во внутреннем цикле. Переменная шага внешнего цикла foreach должна быть экземпляром интерфейса IGrouping, совместимым с ключом и типом элемента данных. В рассматриваемом здесь примере ключи и элементы данных относятся к типу string. Поэтому переменная sites шага внешнего цикла имеет тип IGrouping<string, string>, а переменная site шага внутреннего цикла — тип string. Ради краткости данного примера обе переменные объявляются неявно, хотя их можно объявить и явным образом, как показано ниже.

foreach(IGrouping<string, string> sites in webAddrs) {

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

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

  foreach(string site in sites)

    Console.WriteLine("    " + site);

  Console.WriteLine();

}

Продолжение запроса с помощью оператора into

При использовании в запросе оператора select или group иногда требуется сформировать временный результат, который будет служить продолжением запроса для получения окончательного результата. Такое продолжение осуществляется с помощью оператора into в комбинации с оператором select или group. Ниже приведена общая форма оператора into:

into имя тело_запроса

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

-------------------------------

ПРИМЕЧАНИЕ

Существует также форма оператора into, предназначенная для использования вместе с оператором join, создающим групповое объединение, о котором речь пойдет далее в этой главе.

-------------------------------

Ниже приведен пример программы, в которой оператор into используется вместе с оператором group. Эта программа является переработанным вариантом предыдущего примера, в котором список веб-сайтов формируется по имени домена самого верхнего уровня. А в данном примере первоначальные результаты запроса сохраняются в переменной диапазона ws и затем отбираются для исключения всех групп, состоящих менее чем из трех элементов.

// Использовать оператор into вместе с оператором group.

using System;

using System.Linq;

class IntoDemo {

  static void Main() {

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

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

      "hsNameG.tv", "hsNameH.net", "hsNamel.tv"

    };

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

    // веб-сайтов, группируемых

    //по имени домена самого верхнего уровня, но выбрать только те

    // группы, которые состоят более чем из двух членов.

    // Здесь ws — это переменная диапазона для ряда групп,

    // возвращаемых при выполнении первой половины запроса,

    var webAddrs = from addr in websites

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

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

         into ws where ws.Count() > 2 select ws;

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

    Console.WriteLine("Домены самого верхнего уровня " +

             "с более чем двумя членами.");

    foreach(var sites in webAddrs) {

      Console.WriteLine("Содержимое домена: " + sites.Key);

      foreach(var site in sites)

        Console.WriteLine ("    "    +    site);

      Console.WriteLine();

    }

  }

}

Эта программа дает следующий результат:

Домены самого верхнего уровня с более чем двумя членами.

Содержимое домена: .net

hsNameB.net

hsNameC.net

hsNameH.net

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

Обратите особое внимание в данном примере программы на следующую последовательность операторов в формируемом запросе.

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

into ws where ws.Count() > 2 select ws;

Сначала результаты выполнения оператора group сохраняются как временные для последующей обработки оператором where. В качестве переменной диапазона в данный момент служит переменная ws. Она охватывает все группы, возвращаемые оператором group. Затем результаты запроса отбираются в операторе where с таким расчетом, чтобы в конечном итоге остались только те группы, которые содержат больше двух членов. Для этой цели вызывается метод Count(), который является методом расширения и реализуется для всех объектов типа IEnumerable. Он возвращает количество элементов в последовательности. (Подробнее о методах расширения речь пойдет далее в этой главе.) А получающаяся в итоге последовательность групп возвращается оператором select.

Применение оператора let для создания временной переменной в запросе

Иногда возникает потребность временно сохранить некоторое значение в самом запросе. Допустим, что требуется создать переменную перечислимого типа, которую можно будет затем запросить, или же сохранить некоторое значение, чтобы в дальнейшем использовать его в операторе where. Независимо от преследуемой цели, эти виды функций могут быть осуществлены с помощью оператора let. Ниже приведена общая форма оператора let:

let имя = выражение

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

В приведенном ниже примере программы демонстрируется применение оператора let для создания еще одного перечислимого источника данных. В качестве входных данных в запрос вводится массив символьных строк, которые затем преобразуются в массивы типа char. Для этой цели служит еще один метод обработки строк, называемый ToCharArray() и возвращающий массив, содержащий символы в строке. Полученный результат присваивается переменной chrArray, которая затем используется во вложенном операторе from для извлечения отдельных символов из массива. И наконец, полученные символы сортируются в запросе, и из них формируется результирующая последовательность.

// Использовать оператор let в месте с вложенным оператором from.

using System;

using System.Linq;

class LetDemo {

  static void Main() {

    string[] strs = { "alpha", "beta", "gamma" };

    // Сформировать запрос на получение символов, возвращаемых из

    // строк в отсортированной последовательности. Обратите внимание

    // на применение вложенного оператора from,

    var chrs = from str in strs

          let chrArray = str.ToCharArray()

          from ch in chrArray orderby ch

          select ch;

    Console.WriteLine("Отдельные символы, отсортированные по порядку:");

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

    foreach(char с in chrs) Console.Write(с + " ");

    Console.WriteLine();

  }

}

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

1 ... 174 175 176 177 178 179 180 181 182 ... 294
На этой странице вы можете бесплатно читать книгу C# 4.0: полное руководство - Герберт Шилдт бесплатно.
Похожие на C# 4.0: полное руководство - Герберт Шилдт книги

Оставить комментарий