Честно говоря, иногда это может быть ситуативным, когда вы начинаете использовать Funcs и Actions. Скажем, вы используете эти три функции:
Func<DataClasses.User, String> userName = user => user.UserName;
Func<DataClasses.User, Boolean> userIDOverTen = user => user.UserID < 10;
Func<DataClasses.User, Boolean> userIDUnderTen = user => user.UserID > 10;
Как видите, первое заменяет выражение lamdba, чтобы получить имя пользователя, второе заменяет выражение lamdba, используемое для проверки, если идентификатор меньше 10, и давайте посмотрим правде в глаза, третье должно быть довольно легко понять. Теперь.
ПРИМЕЧАНИЕ. Это глупый пример, но он работает.
var userList =
from user in userList
where userIDOverTen(user)
select userName;
Versus
var otherList =
userList
.Where(IDIsBelowNumber)
.Select(userName)
В этом примере второй является немного менее многословным, поскольку метод расширения может в полной мере использовать Func, но выражение Linq не может, так как он ищет только Boolean, а не Func, который возвращает Boolean. Однако здесь может быть лучше использовать язык выражений. Скажем, у вас уже есть метод, который принимает больше, чем просто пользователь:
private Boolean IDIsBelowNumber(DataClasses.User user,
Int32 someNumber, Boolean doSomething)
{
return user.UserID < someNumber;
}
Примечание: doSomething существует только потому, что метод where расширения подходит для метода, который принимает пользователя и целое число и возвращает логическое значение. Раздражает этот пример.
Теперь, если вы посмотрите на запрос Linq:
var completeList =
from user in userList
where IDIsBelowNumber(user, 10, true)
select userName;
Ты хорош для этого. Теперь метод расширения:
var otherList =
userList
.Where(IDIsBelowNumber????)
.Select(userName)
Без лямбда-выражения я действительно не могу вызвать этот метод. Итак, теперь мне нужно создать метод, который создает Func на основе исходного вызова метода.
private Func<DataClasses.User, Boolean> IDIsBelowNumberFunc(Int32 number)
{
return user => IDIsBelowNumber(user, number, true);
}
А затем подключите его:
var otherList =
userList
.Where(IDIsBelowNumberFunc(10))
.Select(userName)
Как видите, иногда может быть проще использовать подход с использованием запросов.