LINQ是否通过排序/转换数据结构进行任何优化?
即
LINQ会在此代码中进行迭代,还是对数据进行任何类型的排序/转换以优化查找操作?
var list = new List<IdCard> {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,对吧?
答案 0 :(得分:2)
LINQ是否通过排序/转换数据结构进行任何优化?
是的。贯穿各种LINQ方法的各种优化。
LINQ是否在此代码中迭代
是的
是否对数据进行了任何类型的排序/转换以优化查找操作?
不。以某种排序或散列的方式构建全新的数据结构所花费的工作,除了重复序列直到找到第一个项目之外,还要做更多的工作。在LINQ实现中创建集合不仅会为每个项目处理更多的工作(因为您不仅要执行谓词,还需要集合为将其存储以供以后存储所要做的任何工作),并且通过存储使用更多的内存项需要更长的时间,但是您找不到匹配项就无法退出,就像通过简单的迭代一样。
然后,对于上面的代码,最好使用字典查找(如果有很多查找的话)而不是依赖LINQ,对吧?
是的,如果您仅使用一种类型提供的代码构造代码集合,该类型将提供本机提供最有效地执行您想要对该集合执行的操作的代码(在这种情况下,该集合会根据键(例如字典或排序字典),而不是使用不正确的集合类型和LINQ方法。
当为拥有的任何集合(或可以拥有的,如果可以控制要使用的集合)找到想要的最佳算法与为任何集合使用的算法相同时,使用LINQ很有用。任意顺序。在很多情况下都是如此。这不是其中一种情况。
答案 1 :(得分:0)
谢谢您的回答!它们非常有用。
此查询的答案似乎确实是某些LINQ代码可能已优化,并且检查的最佳方法是简单地查看源代码。
如果我输入错了,请纠正我,但是该代码似乎在此处可用:
https://github.com/Microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs
答案 2 :(得分:-1)
否,所有带有谓词参数的System.Linq
扩展都枚举了源集合,并且不修改或优化源集合。某些情况(例如OrderBy,GroupBy和Intersect)使用本地集合来防止多次枚举源。
Lookup
(类似于Dictionary<K, List<V>>
)可以用作alternative to Dictionary:
var list = new List<IdCard> {new IdCard(){Name = "a", Number = 1}, new IdCard() { Name = "b", Number = 2 } };
var lookup = list.ToLookup(c => c.Name);
var idA = lookup["a"].FirstOrDefault();
var idB = lookup["b"].FirstOrDefault();