string[] currentVideoGames = {"Morrowind", "Uncharted 2",
"Fallout 3", "Daxter", "System Shock 2"};
// Разбить на части.
var gamesWithSpaces =
currentVideoGames.Where(game => game.Contains(" "));
var orderedGames = gamesWithSpaces.OrderBy(game => game);
var subset = orderedGames.Select(game => game);
foreach (var game in subset)
{
Console.WriteLine("Item: {0}", game);
}
Console.WriteLine();
}
Как видите, построение выражения запроса LINQ с применением методов класса Enumerable напрямую приводит к намного более многословному запросу, чем в случае использования операций запросов С#. Кроме того, поскольку методы Enumerable требуют передачи делегатов в качестве параметров, обычно необходимо писать лямбда-выражения, чтобы обеспечить обработку входных данных внутренней целью делегата.
Построение выражений запросов с использованием типа Enumerable и анонимных методов
Учитывая, что лямбда-выражения C# — это просто сокращенный способ работы с анонимными методами, рассмотрим третье выражение запроса внутри вспомогательного метода QueryStringsWithAnonymousMethods():
static void QueryStringsWithAnonymousMethods()
{
Console.WriteLine("***** Using Anonymous Methods *****");
string[] currentVideoGames = {"Morrowind", "Uncharted 2",
"Fallout 3", "Daxter", "System Shock 2"};
// Построить необходимые делегаты Func<>
// с использованием анонимных методов.
Func
delegate(string game) { return game.Contains(" "); };
Func
// Передать делегаты в методы класса Enumerable.
var subset =
currentVideoGames.Where(searchFilter).OrderBy(itemToProcess).
Select(itemToProcess);
// Вывести результаты.
foreach (var game in subset)
{
Console.WriteLine("Item: {0}", game);
}
Console.WriteLine();
}
Такой вариант выражения запроса оказывается еще более многословным из-за создания вручную делегатов Func<>, применяемых методами Where(), OrderBy() и Select() класса Enumerable. Положительная сторона данного подхода связана с тем, что синтаксис анонимных методов позволяет заключить всю обработку, выполняемую делегатами, в единственное определение метода. Тем не менее, этот метод функционально эквивалентен методам QueryStringsWithEnumerableAndLambdas() и QueryStringsWithOperators(), созданным в предшествующих разделах.
Построение выражений запросов с использованием типа Enumerable и низкоуровневых делегатов
Наконец, если вы хотите строить выражение запроса с применением Func<>. Ниже показана финальная версия выражения запроса, смоделированная внутри нового типа класса по имени VeryComplexQueryExpression:
class VeryComplexQueryExpression
{
public static void QueryStringsWithRawDelegates()
{
Console.WriteLine("***** Using Raw Delegates *****");
string[] currentVideoGames = {"Morrowind", "Uncharted 2",
"Fallout 3", "Daxter", "System Shock 2"};
// Построить необходимые делегаты Func<>.
Func
new Func
Func
new Func
// Передать делегаты в методы класса Enumerable.
var subset =
currentVideoGames
.Where(searchFilter)