Console.WriteLine("Среднее значение равно " + nums.Average());
if(nums.All(n => n > 0))
Console.WriteLine("Все значения больше нуля.");
if(nums.Any(n => (n % 2) == 0))
Console.WriteLine("По крайней мере одно значение является четным.");
if(nums.Contains(3))
Console.WriteLine("Массив содержит значение 3.");
}
}
Вот к какому результату приводит выполнение этой программы.
Минимальное значение равно 1
Максимальное значение равно 5
Первое значение равно 3
Последнее значение равно 4
Суммарное значение равно 15
Среднее значение равно 3
Все значения больше нуля.
По крайней мере одно значение является четным
Массив содержит значение 3.
Методы расширения, связанные с запросами, можно также использовать в самом запросе, основываясь на синтаксисе запросов, предусмотренном в С#. И в действительности это делается очень часто. Например, метод Average()
используется в приведенной ниже программе для получения последовательности, состоящей только из тех значений, которые оказываются меньше среднего всех значений в массиве.
// Использовать метод Average() вместе с синтаксисом запросов.
using System;
using System.Linq;
class ExtMethods2 {
static void Main() {
int[] nums = { 1, 2, 4, 8, 6, 9, 10, 3, 6, 7 };
var ItAvg = from n in nums
let x = nums.Average()
where n < x
select n;
Console.WriteLine("Среднее значение равно " + nums.Average());
Console.Write("Значения меньше среднего: ");
// Выполнить запрос и вывести его результаты,
foreach(int i in ItAvg) Console.Write(i + " ");
Console.WriteLine();
}
}
При выполнении этой программы получается следующий результат.
Среднее значение равно 5.6
Значения меньше среднего: 1 2 4 3
Обратите особое внимание в этой программе на следующий код запроса.
var ItAvg = from n in nums
let x = nums.Average()
where n < x
select n;
Как видите, переменной x в операторе let
присваивается среднее всех значений в массиве nums. Это значение получается в результате вызова метода Average()
для массива nums
.
Режимы выполнения запросов: отложенный и немедленный
В LINQ запросы выполняются в двух разных режимах: немедленном и отложенном. Как пояснялось ранее в этой главе, при формировании запроса определяется ряд правил, которые не выполняются вплоть до оператора цикла foreach
. Это так называемое
Но если используются методы расширения, дающие результат, отличающийся от последовательности, то запрос должен быть выполнен для получения этого результата. Рассмотрим, например, метод расширения Count()
. Для того чтобы этот метод возвратил количество элементов в последовательности, необходимо выполнить запрос, и это делается автоматически при вызове метода Count()
. В этом случае имеет место foreach
.
Ниже приведен простой пример программы для получения количества положительных элементов, содержащихся в последовательности.
// Использовать режим немедленного выполнения запроса
using System;
using System.Linq;
class ImmediateExec {
static void Main() {
int[] nums = { 1,
// Сформировать запрос на получение количества
// положительных значений в массиве nums.
int len = (from n in nums where n > 0 select n).Count();
Console.WriteLine("Количество положительных значений в массиве nums: " + len) ;
}
}