c# – 将IEnumerable转换为字典以获得性能?

前端之家收集整理的这篇文章主要介绍了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获胜.

一般来说,你应该:

>对同一数据集多次执行查找时使用词典.
>在执行查找时使用IEnumerable.
>当数据集太大而无法放入内存时,请使用IEnumerable.

>请记住,sql表可以像Dictionary一样使用,因此您可以使用它来抵消内存压力.

进一步的考虑

Dictionarys使用GetHashCode()来组织其内部状态. Dictionary的性能以两种方式与哈希码密切相关.

>执行不佳的GetHashCode() – 每次添加,查找或删除项目时都会产生开销.
>低质量哈希码 – 导致字典没有O(1)查找性能.

大多数内置的.Net类型(尤其是值类型)都有非常好的散列算法.但是,对于类似列表的类型(例如字符串),GetHashCode()具有O(n)性能 – 因为它需要迭代整个字符串.因此,字典的性能可以被视为(其中M是高效的GetHashCode()的大哦):O(1)M.

猜你在找的C#相关文章