Страница 321 из 502
<b>// Использовать методы запроса для формирования простого запроса.</b>
<b>// Это переделанный вариант первого примера программы из настоящей главы.</b>
<b>using System;</b>
<b>using System.Linq;</b>
<b>class SimpQuery {</b>
<b> static void Main() {</b>
<b> int[] nums = { 1, -2, 3, 0, -4, 5 };</b>
<b> // Использовать методы Where() и Select() для</b>
<b> // формирования простого запроса.</b>
<b> var posNums = nums.Where(n => n > 0).Select(r => r);</b>
<b> Console.Write("Положительные значения из массива nums: ");</b>
<b> // Выполнить запрос и вывести его результаты,</b>
<b> foreach(int i in posNums) Console.Write(i + " ") ;</b>
<b> Console.WriteLine();</b>
<b> }</b>
<b>}</b>
Эта версия программы дает такой же результат, как и исходная.
<b>Положительные значения из массива nums: 1 3 5</b>
Обратите особое внимание в данной программе на следующую строку кода.
<b>var posNums = nums.Where(n => n > 0).Select(r => r);</b>
В этой строке кода формируется запрос, сохраняемый в переменной posNums. По этому запросу, в свою очередь, формируется последовательность положительных значений, извлекаемых из массива nums. Для этой цели служит метод Where(), отбирающий запрашиваемые значения, а также метод Select(), избирательно формирующий из этих значений окончательный результат. Метод Where() может быть вызван для массива nums, поскольку во всех массивах реализуется интерфейс IEnumerable<T>, поддерживающий методы расширения запроса.
Формально метод Select() в рассматриваемом здесь примере не нужен, поскольку это простой запрос. Ведь последовательность, возвращаемая методом Where(), уже содержит конечный результат. Но окончательный выбор можно сделать и по более сложному критерию, как это было показано ранее на примерах использования синтаксиса запросов. Так, по приведенному ниже запросу из массива nums возвращаются положительные значения, увеличенные на порядок величины.
<b>var posNums = nums.Where(n => n > 0) .Select (r => r * 10);</b>
Как и следовало ожидать, в цепочку можно объединять и другие операции над данными, получаемыми по запросу. Например, по следующему запросу выбираются положительные значения, которые затем сортируются по убывающей и возвращаются в виде результирующей последовательности:
<b>var posNums = nums.Where(n => n > 0).OrderByDescending(j => j);</b>
где выражение j => j обозначает, что упорядочение зависит от входного параметра, который является элементом данных из последовательности, получаемой из метода Where().
В приведенном ниже примере демонстрируется применение метода запроса GroupBy(). Это измененный вариант представленного ранее примера.
<b>// Продемонстрировать применение метода запроса GroupBy().</b>
<b>// Это переработанный вариант примера, представленного ранее</b>
<b>// для демонстрации синтаксиса запросов.</b>
<b>using System;</b>
<b>using System.Linq;</b>
<b>class GroupByDemo {</b>
<b> static void Main() {</b>
<b> string[] websites = {</b>
<b> "hsNameA.com", "hsNameB.net", "hsNameC.net",</b>
<b> "hsNameD.com", "hsNameE.org", "hsNameF.org",</b>
<b> "hsNameG.tv", "hsNameH.net", "hsNamel.tv"</b>
<b> };</b>
<b> // Использовать методы запроса для группирования</b>
<b> // веб-сайтов по имени домена самого верхнего уровня.</b>
<b> var webAddrs = websites.Where(w => w.LastIndexOf('.') != 1).</b>
<b> GroupBy(x => x.Substring(x.LastIndexOf(".", x.Length)));</b>
<b> // Выполнить запрос и вывести его результаты, foreach(var sites in webAddrs) {</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>