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

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

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

ПРИМЕЧАНИЕ

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

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

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

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

<b>using System;</b>

<b>using System.Linq;</b>

<b>class IntoDemo {</b>

<b>  static void Main() {</b>

<b>    string[] websites = { &quot;hsNameA.com&quot;, &quot;hsNameB.net&quot;,</b>

<b>      &quot;hsNameC.net&quot;, &quot;hsNameD.com&quot;, &quot;hsNameE.org&quot;, &quot;hsNameF.org&quot;,</b>

<b>      &quot;hsNameG.tv&quot;, &quot;hsNameH.net&quot;, &quot;hsNamel.tv&quot;</b>

<b>    };</b>

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

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

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

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

<b>    // Здесь ws — это переменная диапазона для ряда групп,</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>         into ws where ws.Count() &gt; 2 select ws;</b>

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

<b>    Console.WriteLine(&quot;Домены самого верхнего уровня &quot; +</b>

<b>             &quot;с более чем двумя членами.&quot;);</b>

<b>    foreach(var sites in webAddrs) {</b>

<b>      Console.WriteLine(&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>Домены самого верхнего уровня с более чем двумя членами.</b>

<b>Содержимое домена: .net</b>

<b>hsNameB.net</b>

<b>hsNameC.net</b>

<b>hsNameH.net</b>

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

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

<b>group addr by addr.Substring(addr.LastIndexOf('.'))</b>

<b>into ws where ws.Count() &gt; 2 select ws;</b>

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

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

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

<b>let имя = выражение</b>

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

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