Страница 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("Минимальное значение равно " + nums.Min());</b>
<b> Console.WriteLine("Максимальное значение равно " + nums.Max());</b>
<b> Console.WriteLine("Первое значение равно " + nums.First());</b>
<b> Console.WriteLine("Последнее значение равно " + nums.Last());</b>
<b> Console.WriteLine("Суммарное значение равно " + nums.Sum());</b>
<b> Console.WriteLine("Среднее значение равно " + nums.Average());</b>
<b> if(nums.All(n => n > 0))</b>
<b> Console.WriteLine("Все значения больше нуля.");</b>
<b> if(nums.Any(n => (n % 2) == 0))</b>
<b> Console.WriteLine("По крайней мере одно значение является четным.");</b>
<b> if(nums.Contains(3))</b>
<b> Console.WriteLine("Массив содержит значение 3.");</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 < x</b>
<b> select n;</b>
<b> Console.WriteLine("Среднее значение равно " + nums.Average());</b>
<b> Console.Write("Значения меньше среднего: ");</b>
<b> // Выполнить запрос и вывести его результаты,</b>
<b> foreach(int i in ItAvg) Console.Write(i + " ");</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 < x</b>
<b> select n;</b>
Как видите, переменной x в операторе let присваивается среднее всех значений в массиве nums. Это значение получается в результате вызова метода Average() для массива nums.
Режимы выполнения запросов: отложенный и немедленный
В LINQ запросы выполняются в двух разных режимах: немедленном и отложенном. Как пояснялось ранее в этой главе, при формировании запроса определяется ряд правил, которые не выполняются вплоть до оператора цикла foreach. Это так называемое отложенное выполнение.