c# – 将IEnumerable转换为字典以获得性能?
我最近在我的公司看到了一个新趋势,我们通过简单的LINQ转换将IEnumerable更改为字典,如下所示:
enumerable.ToDictionary(x=>x); 当集合上的操作是包含/访问时,我们大多数情况下最终会这样做,显然字典在这种情况下具有更好的性能. 但我意识到将Enumerable转换为字典有其自身的成本,我想知道它在什么时候开始收支平衡(如果确实如此),即IEnumerable Contains / Access的性能等于ToDictionary访问/包含. 好的我可能会添加没有数据库访问,可以从数据库查询创建枚举,这就是它,并且可以在之后编辑枚举… 知道密钥的数据类型如何影响性能也很有趣? 查询可能一般是2-5次,但有时也可能是一次.但我见过像这样的东西 var element=Enumerable.SingleorDefault(x=>x.Id); //do something if element is null or return 对于字典: if(dictionary.ContainsKey(x)) //do something if false else return 这已经困扰了我很长一段时间了. 解决方法
字典的性能与IEnumerable相比
如果使用正确,字典总是更快读取(除非数据集非常小,例如10个项目).创建它时可能会有开销. 给定m作为针对同一对象执行的查找量(这些是近似值): > IEnumerable的性能(从干净的列表创建):O(mn) >这是因为你需要每次查看所有项目(主要是m * O(n)). >字典的性能:O(n)O(1m)或O(m n) >这是因为您需要先插入项目(O(n)). 通常可以看出,当m> 1时,词典获胜.当m = 1或m = 0时,IEnumerable获胜. 一般来说,你应该: >对同一数据集多次执行查找时使用词典. >请记住,SQL表可以像Dictionary一样使用,因此您可以使用它来抵消内存压力. 进一步的考虑 Dictionarys使用GetHashCode()来组织其内部状态. Dictionary的性能以两种方式与哈希码密切相关. >执行不佳的GetHashCode() – 每次添加,查找或删除项目时都会产生开销. 大多数内置的.Net类型(尤其是值类型)都有非常好的散列算法.但是,对于类似列表的类型(例如字符串),GetHashCode()具有O(n)性能 – 因为它需要迭代整个字符串.因此,字典的性能可以被视为(其中M是高效的GetHashCode()的大哦):O(1)M. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |