Страница 313 из 502
<b> "hsNameH.net", "hsNamel.tv"</b>
<b> };</b>
<b> // Сформировать запрос на получение списка веб-сайтов,</b>
<b> // группируемых по имени домена самого верхнего уровня.</b>
<b> var webAddrs = from addr in websites</b>
<b> where addr.LastIndexOf('.') != -1</b>
<b> group addr by addr.Substring(addr.LastIndexOf('.'));</b>
<b> // Выполнить запрос и вывести его результаты,</b>
<b> foreach(var sites in webAddrs) {</b>
<b> Console.WriteLine("Веб-сайты, сгруппированные " +</b>
<b> "по имени домена" + sites.Key);</b>
<b> foreach(var site in sites)</b>
<b> Console.WriteLine (" " + site);</b>
<b> Console.WriteLine();</b>
<b> }</b>
<b> }</b>
<b>}</b>
Вот к какому результату приводит выполнение этого кода.
<b>Веб-сайты, сгруппированные по имени домена .соm</b>
<b>hsNameA.соm</b>
<b>hsNameD.соm</b>
<b>Веб-сайты, сгруппированные по имени домена .net</b>
<b>hsNameB.net</b>
<b>hsNameC.net</b>
<b>hsNameH.net</b>
<b>Веб-сайты, сгруппированные по имени домена .org</b>
<b>hsNameE.org</b>
<b>hsNameF.org</b>
<b>Веб-сайты, сгруппированные по имени домена .tv</b>
<b>hsNameG.tv</b>
<b>hsNamel.tv</b>
Как следует из приведенного выше результата, данные, получаемые по запросу, группируются по имени домена самого верхнего уровня в адресе веб-сайта. Обратите внимание на то, как это делается в операторе group из следующего запроса.
<b>var webAddrs = from addr in websites</b>
<b> where addr.LastIndexOf('.') != -1</b>
<b> group addr by addr.Substring(addr.LastIndexOf('.'));</b>
Ключ в этом операторе создается с помощью методов LastIndexOf() и Substring(), определенных для данных типа string. (Эти методы упоминаются в главе 7, посвященной массивам и строкам. Вариант метода Substring(), используемый в данном примере, возвращает подстроку, начинающуюся с места, обозначаемого индексом, и продолжающуюся до конца вызывающей строки.) Индекс последней точки в адресе веб-сайта определяется с помощью метода LastIndexOf(). По этому индексу в методе Substring() создается оставшаяся часть строки, в которой содержится имя домена самого верхнего уровня. Обратите внимание на то, что в операторе where отсеиваются все строки, которые не содержат точку. Метод LastIndexOf() возвращает -1, если указанная подстрока не содержится в вызывающей строке.
Последовательность результатов, получаемых при выполнении запроса, хранящегося в переменной webAddrs, представляет собой список групп, поэтому для доступа к каждому члену группы требуются два цикла foreach. Доступ к каждой группе осуществляется во внешнем цикле, а члены внутри группы перечисляются во внутреннем цикле. Переменная шага внешнего цикла foreach должна быть экземпляром интерфейса IGrouping, совместимым с ключом и типом элемента данных. В рассматриваемом здесь примере ключи и элементы данных относятся к типу string. Поэтому переменная sites шага внешнего цикла имеет тип IGrouping<string, string>, а переменная site шага внутреннего цикла — тип string. Ради краткости данного примера обе переменные объявляются неявно, хотя их можно объявить и явным образом, как показано ниже.
<b>foreach(IGrouping<string, string> sites in webAddrs) {</b>
<b> Console.WriteLine("Веб-сайты, сгруппированные " +</b>
<b> "по имени домена" + sites.Key);</b>
<b> foreach(string site in sites)</b>
<b> Console.WriteLine(" " + site);</b>
<b> Console.WriteLine();</b>
<b>}</b>
Продолжение запроса с помощью оператора into
При использовании в запросе оператора select или group иногда требуется сформировать временный результат, который будет служить продолжением запроса для получения окончательного результата. Такое продолжение осуществляется с помощью оператора into в комбинации с оператором select или group. Ниже приведена общая форма оператора into:
<b>into имя тело_запроса</b>
где имя обозначает конкретное имя переменной диапазона, используемой для циклического обращения к временному результату в продолжении запроса, на которое указывает тело_запроса. Когда оператор into используется вместе с оператором select или group, то его называют продолжением запроса, поскольку он продолжает запрос. По существу, продолжение запроса воплощает в себе принцип построения нового запроса по результатам предыдущего.