请告诉我(1)中“where”和(2)中“where()”之间的区别。
何时使用“where”和“where()”?
List<Person> pList =
new List<Person>
{
new Person
{EmpNo=1,FirstName="Marc",LastName="Loel",Salary=3434},
new Person
{EmpNo=2, FirstName="Steve",LastName="Kaith",Salary=4545},
new Person
{EmpNo=3,FirstName="Neol",LastName="Henk",Salary=2222},
};
(1) var v = from p in pList where p.EmpNo == 1 select new { p.FirstName };
(2) var query =pList .Where(p => p.EmpNo == 1)
.Select(p => new { p.FirstName});
答案 0 :(得分:25)
不同之处在于,一种形式更易于阅读,另一种形式更难以阅读。麻烦的是,大约一半的人认为第一个更容易,一半的人认为第二个更容易!选择你最喜欢的那个并坚持下去;他们的意思完全一样。
答案 1 :(得分:6)
没有真正的区别。第一个where(和select)是一个特殊的语言查询表达式,由编译器转换为其他基于lambda的Where和Select方法。
答案 2 :(得分:5)
这只是语法糖。事实上,如果你只有一个具有正确Where方法的类,即使该类不可枚举,你也可以使用语法魔法:
class MyClass
{
public IQueryable<int> Where(Func<int, bool> predicate)
{
return Enumerable.Range(1, 100).AsQueryable();
}
}
static void Main(string[] args)
{
var q = from p in new MyClass()
where p == 10
select p;
}
这没有做任何事情,但它会构建并调用该方法。
答案 3 :(得分:2)
没有区别。数字(1)只是用一些语法糖写的。
快速查看反射器中的代码,它看起来像这样:
var v = pList.Where<Person>(delegate (Person p) {
return (p.EmpNo == 1);
}).Select(delegate (Person p) {
return new { FirstName = p.FirstName };
});
var query = pList.Where<Person>(delegate (Person p) {
return (p.EmpNo == 1);
}).Select(delegate (Person p) {
return new { FirstName = p.FirstName };
});
如您所见,它们完全相同。
答案 4 :(得分:2)
我相信他们是完全相同的。 Microsoft在(1)中创建了可读性语法,但编译器将其处理为(2)。
答案 5 :(得分:1)
差异(如果你想挑剔)是第一个是LINQ,第二个不是。
LINQ是您在第一个示例中看到的集成查询语言,编译器将其转换为使用第二个示例中所示的扩展方法。
答案 6 :(得分:-1)
in.where()方法还有一些额外的功能,例如:你可以使用where方法的索引扩展。
但是对于给定的例子,它只是可读性。