Но если оба способа оказываются в конечном счете равноценными, то какой из них лучше для программирования на С#? В целом, рекомендуется чаще пользоваться синтаксисом запросов, поскольку он полностью интегрирован в язык С#, поддерживается соответствующими ключевыми словами и синтаксическим конструкциями.
Дополнительные методы расширения, связанные с запросами
Помимо методов, соответствующих операторам запроса, поддерживаемым в С#, име-ется ряд других методов расширения, связанных с запросами и зачастую оказывающих помощь в формировании запросов. Эти методы предоставляются в среде .NET Framework и определены для интерфейса IEnumerable в классе Enumerable. Ниже приведены наиболее часто используемые методы расширения, связанные с запросами. Многие из них могут перегружаться, поэтому они представлены лишь в самой общей форме.
Метод
Описание
All( predicate)
Возвращает логическое значение true,если все элементы в последовательности удовлетворяют условию, задаваемому параметром
.predicate
Any( predicate)
Возвращает логическое значение true,если любой элемент в последовательности удовлетворяет условию, задаваемому параметром
predicate
Average()
Возвращает среднее всех значений в числовой последовательности
Contains (value)
Возвращает логическое значение true,если в последовательности содержится указанный объект
Count()
Возвращает длину последовательности, т.е. количество составляющих ее элементов
First()
Возвращает первый элемент в последовательности
Last()
Возвращает последний элемент в последовательности
Max ()
Возвращает максимальное значение в последовательности
Min ()
Возвращает минимальное значение в последовательности
Sum ()
Возвращает сумму значений в числовой последовательности
Метод Count () уже демонстрировался ранее в этой главе. А в следующей программе демонстрируются остальные методы расширения, связанные с запросами.
// Использовать ряд методов расширения, определенных в классе Enumerable.
using System; using System.Linq;
class ExtMethods { static void Main() {
int[] nums = { 3, 1, 2, 5, 4 };
Console .WriteLine ("Минимальное значение равно " + nums.MinO);
Console.WriteLine("Максимальное значение равно " + nums.Max());
Console.WriteLine("Первое значение равно " + nums.First());
Console.WriteLine("Последнее значение равно " + nums.Last());
Console.WriteLine("Суммарное значение равно " + nums.SumO);
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 ();
}
Читать дальше