Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两种Linq调用的性能比较_C#_.net_Performance_Linq - Fatal编程技术网

C# 两种Linq调用的性能比较

C# 两种Linq调用的性能比较,c#,.net,performance,linq,C#,.net,Performance,Linq,假设有两个查询在内存列表上运行 使用扩展方法的第一个查询: var temp=listX.Whereq=>q.SomeProperty==someValue 第二个问题: var temp = from o in listX where o.SomeProperty == someValue select o; 两个查询在性能方面是否存在差异;如果有,为什么?没有,根本没有区别。编译器在内部将第二个版本转换为第一个版本 C规范§7.6.1

假设有两个查询在内存列表上运行

使用扩展方法的第一个查询:

var temp=listX.Whereq=>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代码。查询的后续翻译 表达式时,生成的方法调用将作为正则表达式处理 方法调用,这可能反过来发现错误,例如 如果方法不存在,参数的类型错误,或者 方法是泛型的,类型推断失败


没有区别。它将在同一时间产生相同的结果。基本上是相同的代码,语法不同。

简短的问题,简短的回答:

没有区别。两者都是相同的,只是用不同的语法编写


另请参见MSDN文档。

+1,第二个选项将编译为第一个选项,这在使用LINQPad时很容易看到。@Jon那么我可以假设使用扩展方法根本不会增加任何开销吗?@daryal:第二种形式是语法糖。它只存在于源代码中。摘录没有回答你的另一个问题吗?这些方法可以是……为什么你不自己试试呢?我可以试试,但是隔离是个问题,尽管我可能只是检查程序集输出。如果两者之间存在细微差异,仅通过创建一个示例来尝试可能不起作用。