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

Страница 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 =&gt; n &gt; 0).Select(r =&gt; r);</b>

<b>    Console.Write(&quot;Положительные значения из массива nums: &quot;);</b>

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

<b>    foreach(int i in posNums) Console.Write(i + &quot; &quot;) ;</b>

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

<b>  }</b>

<b>}</b>

Эта версия программы дает такой же результат, как и исходная.

<b>Положительные значения из массива nums: 1 3 5</b>

Обратите особое внимание в данной программе на следующую строку кода.

<b>var posNums = nums.Where(n =&gt; n &gt; 0).Select(r =&gt; r);</b>

В этой строке кода формируется запрос, сохраняемый в переменной posNums. По этому запросу, в свою очередь, формируется последовательность положительных значений, извлекаемых из массива nums. Для этой цели служит метод Where(), отбирающий запрашиваемые значения, а также метод Select(), избирательно формирующий из этих значений окончательный результат. Метод Where() может быть вызван для массива nums, поскольку во всех массивах реализуется интерфейс IEnumerable&lt;T&gt;, поддерживающий методы расширения запроса.

Формально метод Select() в рассматриваемом здесь примере не нужен, поскольку это простой запрос. Ведь последовательность, возвращаемая методом Where(), уже содержит конечный результат. Но окончательный выбор можно сделать и по более сложному критерию, как это было показано ранее на примерах использования синтаксиса запросов. Так, по приведенному ниже запросу из массива nums возвращаются положительные значения, увеличенные на порядок величины.

<b>var posNums = nums.Where(n =&gt; n &gt; 0) .Select (r =&gt; r * 10);</b>

Как и следовало ожидать, в цепочку можно объединять и другие операции над данными, получаемыми по запросу. Например, по следующему запросу выбираются положительные значения, которые затем сортируются по убывающей и возвращаются в виде результирующей последовательности:

<b>var posNums = nums.Where(n =&gt; n &gt; 0).OrderByDescending(j =&gt; j);</b>

где выражение j =&gt; 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>      &quot;hsNameA.com&quot;, &quot;hsNameB.net&quot;, &quot;hsNameC.net&quot;,</b>

<b>      &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>    var webAddrs = websites.Where(w =&gt; w.LastIndexOf('.') != 1).</b>

<b>          GroupBy(x =&gt; x.Substring(x.LastIndexOf(&quot;.&quot;, x.Length)));</b>

<b>    // Выполнить запрос и вывести его результаты, foreach(var sites in webAddrs) {</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>