Добавить в цитаты Настройки чтения

Страница 313 из 502

<b>          &quot;hsNameH.net&quot;, &quot;hsNamel.tv&quot;</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(&quot;Веб-сайты, сгруппированные &quot; +</b>

<b>             &quot;по имени домена&quot; + sites.Key);</b>

<b>      foreach(var site in sites)</b>

<b>        Console.WriteLine (&quot; &quot; + 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&lt;string, string&gt;, а переменная site шага внутреннего цикла — тип string. Ради краткости данного примера обе переменные объявляются неявно, хотя их можно объявить и явным образом, как показано ниже.

<b>foreach(IGrouping&lt;string, string&gt; sites in webAddrs) {</b>

<b>  Console.WriteLine(&quot;Веб-сайты, сгруппированные &quot; +</b>

<b>       &quot;по имени домена&quot; + sites.Key);</b>

<b>  foreach(string site in sites)</b>

<b>    Console.WriteLine(&quot;    &quot; + site);</b>

<b>  Console.WriteLine();</b>

<b>}</b>

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

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

<b>into имя тело_запроса</b>

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