假设有两个查询在内存列表上运行;
第一个查询(使用扩展方法):
var temp = listX.Where(q => q.SomeProperty == someValue);
第二个查询:
var temp = from o in listX
where o.SomeProperty == someValue
select o;
就性能而言,两个查询之间是否存在差异;如果有,为什么?
假设有两个查询在内存列表上运行;
第一个查询(使用扩展方法):
var temp = listX.Where(q => q.SomeProperty == someValue);
第二个查询:
var temp = from o in listX
where o.SomeProperty == someValue
select o;
就性能而言,两个查询之间是否存在差异;如果有,为什么?
不,根本没有区别。编译器在内部将第二个版本转换为第一个版本。
C# 规范(第 7.6.12 节)规定:
C# 语言不指定查询表达式的执行语义。相反,查询表达式被转换为遵循查询表达式模式(第 7.16.3 节)的方法调用。具体来说,查询表达式被转换为名为
Where
、Select
、SelectMany
、Join
、GroupJoin
、OrderBy
、OrderByDescending
、ThenBy
、ThenByDescending
、GroupBy
和的方法的调用Cast
。这些方法应具有特定的签名和结果类型,如第 7.16.3 节所述。这些方法可以是被查询对象的实例方法,也可以是对象外部的扩展方法,它们实现了查询的实际执行。从查询表达式到方法调用的转换是在执行任何类型绑定或重载决议之前发生的语法映射。翻译保证语法正确,但不保证生成语义正确的 C# 代码。在查询表达式的翻译之后,生成的方法调用将作为常规方法调用处理,这反过来可能会发现错误,例如,如果方法不存在,如果参数的类型错误,或者如果方法是泛型的并且类型推断失败.
没有区别。它将在同一时间产生相同的结果。它基本上是具有不同语法的相同代码。