扩展方法语法vs查询语法
我想弄清楚是否有时间在Lambda表达式中使用标准linq关键字或linq扩展方法。他们似乎做同样的事情,只是写法不同。纯粹是风格问题吗?
var query = from p in Products where p.Name.Contains("foo")
orderby c.Name
select p;
// or with extension methods:
var query = Products
.Where(p => p.Name.Contains("foo"))
.OrderBy(p => p.Name);
它们与第二个示例非常相似,只是第二个示例更为简洁,但如果您不知道=>在做什么,则表达力可能会更低。
回答:
老实说,一旦您开始使用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;
与
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)
因此您可以看到,有时使用查询方法有时可能会更容易。
以上是 扩展方法语法vs查询语法 的全部内容, 来源链接: utcz.com/qa/399404.html