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