LINQ查询表达式是否被优化了?
LINQ查询表达式是否被优化了?
LINQ是否通过排序/转换数据结构来进行优化呢?例如,这段代码中的LINQ是否会进行迭代,或者会对数据进行某种类型的排序/转换以优化查找操作呢?
var list = new List {new IdCard(){Name = "a", Number = 1}, new IdCard() { Name = "b", Number = 2 } }; var idA = list.FirstOrDefault(id => id.Name == "a"); var idB = list.FirstOrDefault(id => id.Name == "b");
我正在尝试理解我的LINQ代码是否直接转化为迭代器方法。如果是的话,那么对于上述代码来说,使用字典查找(假设存在许多查找)而不是依赖LINQ会更好,对吗?
谢谢你的回答!它们非常有启发性。
看起来这个查询的答案真的是一些LINQ代码可能被优化,而最好的方法是查看源代码。
如果我错了,请纠正我,但代码似乎在这里可用:
https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs
LINQ是否通过排序/转换数据结构来进行优化?
是的。在各种LINQ方法中都会进行各种优化。
在这段代码中,LINQ是如何迭代的?
是的。
是否对数据进行排序/转换以优化查找操作?
不是的。构建全新的数据结构(以某种有序或散列方式)所花费的工作量将比迭代序列直到找到第一个项目的工作量更大。在LINQ实现中创建集合不仅会对每个项目进行更多的处理工作(因为您不仅需要执行谓词,还需要执行该集合需要进行的任何处理工作,以将其存储在以后),而且使用更多的内存来存储项目,但是,您无法像使用简单迭代那样在找到匹配项后立即退出。
那么在上面的代码中,如果有很多查找,使用字典查找会优于依赖LINQ,对吗?
是的,如果您仅使用本机提供具有最有效执行所需操作的操作的类型构建集合(在这种情况下,一种优化基于键搜索速度的集合,因此要么是字典,要么是有序字典),而不是使用不正确的集合类型并使用LINQ方法,那么该代码将更好。
当您拥有最好的算法以查找您在任何集合中拥有的内容(或者如果您可以控制使用的集合)并且该算法与您用于任何任意序列的算法相同时,使用LINQ很有用。在许多情况下是如此。而这不是其中的一种情况。