В классе Enumerable
предоставляется немало методов запроса, но основными считаются те методы, которые соответствуют описанным ранее операторам запроса. Эти методы перечислены ниже вместе с соответствующими операторами запроса. Следует, однако, иметь в виду, что эти методы имеют также перегружаемые формы, а здесь они представлены лишь в самой простой своей форме. Но именно эта их форма используется чаще всего.
Оператор запроса Эквивалентный метод запроса
select
Select(
where
Where(
orderby
OrderBy(
OrderByDescending(
join
Join
group
GroupBy(
За исключением метода Join()
, остальные методы запроса принимают единственный аргумент, который представляет собой объект некоторой разновидности обобщенного типа Func
. Это тип встроенного делегата, объявляемый следующим образом:
delegate TResult Func
где TResult
обозначает тип результата, который дает делегат, а Т — тип элемента. В методах запроса аргументы Where()
аргумент
Метод Join()
принимает четыре аргумента. Первый аргумент
)Join()
. Селектор ключа для первой последовательности передается в качестве аргумента
,
.
.Func
, аргумент Func
, тогда как аргумент 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, 0, -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();
}
}
Эта версия программы дает такой же результат, как и исходная.