где TResult обозначает тип результата, который дает делегат, а Т — тип элемента. В методах запроса аргументы selector , predicate или keySelector определяют действие, которое предпринимает метод запроса. Например, в методе Where () аргумент predicate определяет порядок отбора данных в запросе. Каждый метод запроса возвращает перечислимый объект. Поэтому результат выполнения одного метода запроса можно использовать для вызова другого, соединяя эти методы в цепочку.
Метод Join () принимает четыре аргумента. Первый аргумент (inner) представляет собой ссылку на вторую объединяемую последовательность, а первой является последовательность, для которой вызывается метод Join () . Селектор ключа для первой последовательности передается в качестве аргумента outerKeySelector, а селектор ключа для второй последовательности — в качестве аргумента innerKeySelector. Результат объединения обозначается как аргумент resultSelector. Аргумент outerKeySelector имеет тип Func , ТКеу>, аргумент innerKeySelector — тип Func , ТКеу>, тог^а как аргумент resultSelector — тип Func, где TOuter — тип элемента из вызывающей последовательности; Tinner — тип элемента из передаваемой последовательности; TResult — тип элемента из объединяемой в итоге последовательности, возвращаемой в виде перечислимого объекта.
Аргумент метода запроса представляет собой метод, совместимый с указываемой формой делегата Fun с, но он не обязательно должен быть явно объявляемым методом. На самом деле вместо него чаще всего используется лямбда-выражение. Как пояснялось в главе 15, лямбда-выражение обеспечивает более простой, но эффективный способ определения того, что, по существу, является анонимным методом, а компилятор C# автоматически преобразует лямбда-выражение в форму, которая может быть передана в качестве параметра делегату Fun с. Благодаря тому что лямбда-выражения обеспечивают более простой и рациональный способ программирования, они используются во всех примерах, представленных далее в этом разделе.
Формирование запросов с помощью методов запроса
Используя методы запроса одновременно с лямбда-выражениями, можно формировать запросы, вообще не пользуясь синтаксисом, предусмотренным в 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, поддерживающий методы расширения запроса.
Читать дальше