Формирование запросов с помощью методов запроса
Используя методы запроса одновременно с лямбда-выражениями, можно формировать запросы, вообще не пользуясь синтаксисом, предусмотренным в C# для запросов. Вместо этого достаточно вызвать соответствующие методы запроса. Обратимся сначала к простому примеру. Он представляет собой вариант первого примера программы из этой главы, переделанный с целью продемонстрировать применение методов запроса Where () и Select () вместо соответствующих операторов.
// Использовать методы запроса для формирования простого запроса.
// Это переделанный вариант первого примера программы из настоящей главы.
using System; using System.Linq;
class SimpQuery {
static void Main() {
int[] nums = { 1, -2, 3, О, -4, 5 };
// Использовать методы Where() и Select () для // формирования простого запроса.
var posNums = nums.Where(n => n > 0).Select(r => r);
Console.Write("Положительные значения из массива nums: ");
// Выполнить запрос и вывести его результаты, foreach(int i in posNums) Console.Write(i + " ") ;
Console.WriteLine ();
}
}
Эта версия программы дает такой же результат, как и исходная.
Положительные значения из массива nums: 13 5
Обратите особое внимание в данной программе на следующую строку кода.
var posNums = nums.Where(n => n > 0).Select(r => r);
В этой строке кода формируется запрос, сохраняемый в переменной posNums. По этому запросу, в свою очередь, формируется последовательность положительных значений, извлекаемых из массива nums. Для этой цели служит метод Where (), отбирающий запрашиваемые значения, а также метод Select (), избирательно формирующий из этих значений окончательный результат. Метод Where () может быть вызван для массива nums, поскольку во всех массивах реализуется интерфейс IEnumerable<T>, поддерживающий методы расширения запроса.
Формально метод Select () в рассматриваемом здесь примере не нужен, поскольку это простой запрос. Ведь последовательность, возвращаемая методом Where (), уже содержит конечный результат. Но окончательный выбор можно сделать и по более сложному критерию, как это было показано ранее на примерах использования синтаксиса запросов. Так, по приведенному ниже запросу из массива nums возвращаются положительные значения, увеличенные на порядок величины.
var posNums = nums.Where(n => n > 0) .Select (r => r * 10);
Как и следовало ожидать, в цепочку можно объединять и другие операции над данными, получаемыми по запросу. Например, по следующему запросу выбираются положительные значения, которые затем сортируются по убывающей и возвращаются в виде результирующей последовательности:
var posNums = nums.Where(n => n > 0).OrderByDescending(j => j);
где выражение j => j обозначает, что упорядочение зависит от входного параметра, который является элементом данных из последовательности, получаемой из метода Where().
В приведенном ниже примере демонстрируется применение метода запроса GroupBy (). Это измененный вариант представленного ранее примера.
// Продемонстрировать применение метода запроса GroupBy().
// Это переработанный вариант примера, представленного ранее // для демонстрации синтаксиса запросов.
using System; using System.Linq;
class GroupByDemo { static void Main() {
string[] websites = {
"hsNameA.com", "hsNameB.net", "hsNameC.net",
’"hsNameD.com", "hsNameE.org", "hsNameF.org",
"hsNameG.tv", "hsNameH.net", "hsNamel.tv"
};
// Использовать методы запроса для группирования
// веб-сайтов по имени домена самого верхнего уровня.
var webAddrs = websites.Where(w => w.LastlndexOf) != 1).
GroupBy(x => x.Substring(x.LastlndexOf(".", x.Length)));
// Выполнить запрос и вывести его результаты, foreach(var sites in webAddrs) {
Console.WriteLine("Веб-сайты, сгруппированные " +
"по имени домена " + sites.Key); foreach(var site in sites)
Console.WriteLine (" " + site);
Console.WriteLine();
}