Страница 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 = { "hsNameA.com", "hsNameB.net",</b>
<b> "hsNameC.net", "hsNameD.com", "hsNameE.org", "hsNameF.org",</b>
<b> "hsNameG.tv", "hsNameH.net", "hsNamel.tv"</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() > 2 select ws;</b>
<b> // Выполнить запрос и вывести его результаты.</b>
<b> Console.WriteLine("Домены самого верхнего уровня " +</b>
<b> "с более чем двумя членами.");</b>
<b> foreach(var sites in webAddrs) {</b>
<b> Console.WriteLine("Содержимое домена: " + 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>Домены самого верхнего уровня с более чем двумя членами.</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() > 2 select ws;</b>
Сначала результаты выполнения оператора group сохраняются как временные для последующей обработки оператором where. В качестве переменной диапазона в данный момент служит переменная ws. Она охватывает все группы, возвращаемые оператором group. Затем результаты запроса отбираются в операторе where с таким расчетом, чтобы в конечном итоге остались только те группы, которые содержат больше двух членов. Для этой цели вызывается метод Count(), который является методом расширения и реализуется для всех объектов типа IEnumerable. Он возвращает количество элементов в последовательности. (Подробнее о методах расширения речь пойдет далее в этой главе.) А получающаяся в итоге последовательность групп возвращается оператором select.
Применение оператора let для создания временной переменной в запросе
Иногда возникает потребность временно сохранить некоторое значение в самом запросе. Допустим, что требуется создать переменную перечислимого типа, которую можно будет затем запросить, или же сохранить некоторое значение, чтобы в дальнейшем использовать его в операторе where. Независимо от преследуемой цели, эти виды функций могут быть осуществлены с помощью оператора let. Ниже приведена общая форма оператора let:
<b>let имя = выражение</b>
где имя обозначает идентификатор, получающий значение, которое дает выражение. Тип имени выводится из типа выражения.
В приведенном ниже примере программы демонстрируется применение оператора let для создания еще одного перечислимого источника данных. В качестве входных данных в запрос вводится массив символьных строк, которые затем преобразуются в массивы типа char. Для этой цели служит еще один метод обработки строк, называемый ToCharArray() и возвращающий массив, содержащий символы в строке. Полученный результат присваивается переменной chrArray, которая затем используется во вложенном операторе from для извлечения отдельных символов из массива. И наконец, полученные символы сортируются в запросе, и из них формируется результирующая последовательность.