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

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

<b>                 последовательности</b>

<b>Sum()            </b><b>Возвращает сумму значений в числовой</b>

<b>                 последовательности</b>

Метод Count() уже демонстрировался ранее в этой главе. А в следующей программе демонстрируются остальные методы расширения, связанные с запросами.

<b>// Использовать ряд методов расширения, определенных в классе Enumerable.</b>

<b>using System;</b>

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

<b>class ExtMethods {</b>

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

<b>    int[] nums = { 3, 1, 2, 5, 4 };</b>

<b>    Console.WriteLine(&quot;Минимальное значение равно &quot; + nums.Min());</b>

<b>    Console.WriteLine(&quot;Максимальное значение равно &quot; + nums.Max());</b>

<b>    Console.WriteLine(&quot;Первое значение равно &quot; + nums.First());</b>

<b>    Console.WriteLine(&quot;Последнее значение равно &quot; + nums.Last());</b>

<b>    Console.WriteLine(&quot;Суммарное значение равно &quot; + nums.Sum());</b>

<b>    Console.WriteLine(&quot;Среднее значение равно &quot; + nums.Average());</b>

<b>    if(nums.All(n =&gt; n &gt; 0))</b>

<b>      Console.WriteLine(&quot;Все значения больше нуля.&quot;);</b>

<b>    if(nums.Any(n =&gt; (n % 2) == 0))</b>

<b>      Console.WriteLine(&quot;По крайней мере одно значение является четным.&quot;);</b>

<b>    if(nums.Contains(3))</b>

<b>      Console.WriteLine(&quot;Массив содержит значение 3.&quot;);</b>

<b>  }</b>

<b>}</b>

Вот к какому результату приводит выполнение этой программы.

<b>Минимальное значение равно 1</b>

<b>Максимальное значение равно 5</b>

<b>Первое значение равно 3</b>

<b>Последнее значение равно 4</b>

<b>Суммарное значение равно 15</b>

<b>Среднее значение равно 3</b>

<b>Все значения больше нуля.</b>

<b>По крайней мере одно значение является четным</b>

<b>Массив содержит значение 3.</b>

Методы расширения, связанные с запросами, можно также использовать в самом запросе, основываясь на синтаксисе запросов, предусмотренном в С#. И в действительности это делается очень часто. Например, метод Average() используется в приведенной ниже программе для получения последовательности, состоящей только из тех значений, которые оказываются меньше среднего всех значений в массиве.

<b>// Использовать метод Average() вместе с синтаксисом запросов.</b>

<b>using System;</b>

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

<b>class ExtMethods2 {</b>

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

<b>    int[] nums = { 1, 2, 4, 8, 6, 9, 10, 3, 6, 7 };</b>

<b>    var ItAvg = from n in nums</b>

<b>        let x = nums.Average()</b>

<b>        where n &lt; x</b>

<b>        select n;</b>

<b>    Console.WriteLine(&quot;Среднее значение равно &quot; + nums.Average());</b>

<b>    Console.Write(&quot;Значения меньше среднего: &quot;);</b>

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

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

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

<b>  }</b>

<b>}</b>

При выполнении этой программы получается следующий результат.

<b>Среднее значение равно 5.6</b>

<b>Значения меньше среднего: 1 2 4 3</b>

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

<b>var ItAvg = from n in nums</b>

<b>    let x = nums.Average()</b>

<b>    where n &lt; x</b>

<b>    select n;</b>

Как видите, переменной x в операторе let присваивается среднее всех значений в массиве nums. Это значение получается в результате вызова метода Average() для массива nums.

Режимы выполнения запросов: отложенный и немедленный

В LINQ запросы выполняются в двух разных режимах: немедленном и отложенном. Как пояснялось ранее в этой главе, при формировании запроса определяется ряд правил, которые не выполняются вплоть до оператора цикла foreach. Это так называемое отложенное выполнение.