Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#_Linq_Linq To Objects - Fatal编程技术网

C# LINQ是否通过消除循环来提高性能?

C# LINQ是否通过消除循环来提高性能?,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我对一些集合对象(字典、列表)使用了Linq。因此,如果我想根据条件选择项,我会编写一个Linq查询,然后枚举Linq对象。所以我的问题是Linq是否消除了主集合的循环,从而提高了性能?绝对不是。LINQ到对象在内部循环-它还能如何工作 另一方面,LINQ比您可以采取的一些方法更有效,只在需要时才流式传输数据,等等 第三方面,它涉及到额外的间接层(所有迭代器等),这将对性能产生一些边际影响。可能不是。LINQ适合于简洁(希望如此)可读的代码 实际上,它是循环的,除非后台数据结构支持比扫描更高效的

我对一些集合对象(字典、列表)使用了Linq。因此,如果我想根据条件选择项,我会编写一个Linq查询,然后枚举Linq对象。所以我的问题是Linq是否消除了主集合的循环,从而提高了性能?

绝对不是。LINQ到对象在内部循环-它还能如何工作

另一方面,LINQ比您可以采取的一些方法更有效,只在需要时才流式传输数据,等等


第三方面,它涉及到额外的间接层(所有迭代器等),这将对性能产生一些边际影响。

可能不是。LINQ适合于简洁(希望如此)可读的代码


实际上,它是循环的,除非后台数据结构支持比扫描更高效的搜索算法。

不,事实上,如果使用LINQ to SQL,性能会稍差,因为LINQ毕竟是ado.net堆栈顶部的附加层


如果在对象上使用linq。linq进行了一些优化,最重要的是“Yield”,它在生成IEnumerable时开始从IEnumerable生成结果。这比标准方法要好,标准方法必须等待函数填充并返回一个列表才能对其进行迭代。

当您直接使用查询时,仍然可以循环整个集合。 您只是看不到所有内容,因为查询将只返回与筛选器匹配的元素。 整体性能甚至可能会受到影响,这仅仅是因为涉及到所有嵌套迭代器。
当您对查询结果调用ToList()并多次使用此结果时,您的性能会更好。

LINQ不是魔术。我曾经看到有人从帽子里拿出一个IEnumerable….啊哈!我知道你有三只手。所以我发现Linq to Objects在“非常”的情况下效率很低。@NLV:它的效率可能比硬编码的效率要低一些,但是你的代码可读性会更好。事实上,如果我们都写optcodes,它可能会更快,并且不需要编译器。我们都应该切换到这一点。我们现在可以一直到蝴蝶来解决这个问题吗?“除非支持的数据结构支持比扫描更有效的搜索算法”-通常情况下,这是不正确的,除非这种优化特别内置于该查询操作符中。例如,据我所知,
Skip
并没有针对列表进行优化。目前,集合无法“钩住”LINQ to Objects查询。我的观点是,备份数据结构可能支持它,但LINQ to Objects可能不使用此支持。LINQ to SQL:只要两个查询最终相同,则为true。如果你把所有的东西都拉回来,然后使用LINQ对对象进行过滤,速度可能会慢一些。LINQ to objects:如果您已经有一个预填充列表,那么它不会更快。这完全取决于幕后发生了什么。