老实说,有时一旦您开始使用 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 表达式来获取用户名,第二个替换了用于检查 ID 是否低于 10 的 lamdba 表达式,面对现实,第三个现在应该很容易理解了。
注意:这是一个愚蠢的例子,但它确实有效。
var userList =
from user in userList
where userIDOverTen(user)
select userName;
Versus
var otherList =
userList
.Where(IDIsBelowNumber)
.Select(userName)
在此示例中,第二个稍微不那么冗长,因为扩展方法可以充分利用 Func,但 Linq 表达式不能,因为它只是查找布尔值而不是返回布尔值的 Func。然而,这就是使用表达式语言可能更好的地方。假设您已经有了一个不仅仅接受用户的方法:
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)
如果没有 lambda 表达式,我真的无法调用该方法。所以现在我要做的是创建一个方法,该方法根据原始方法调用创建一个 Func 。
private Func<DataClasses.User, Boolean> IDIsBelowNumberFunc(Int32 number)
{
return user => IDIsBelowNumber(user, number, true);
}
然后插入:
var otherList =
userList
.Where(IDIsBelowNumberFunc(10))
.Select(userName)
所以您可以看到,有时使用查询方法可能会更容易。