首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IEnumerable转换为字典以提高性能?

将IEnumerable转换为字典以提高性能?
EN

Stack Overflow用户
提问于 2011-09-07 08:20:17
回答 5查看 3.9K关注 0票数 7

我最近在我的公司看到了一种新的趋势,我们通过简单的LINQ转换将IEnumerable转换为字典,如下所示:

代码语言:javascript
复制
enumerable.ToDictionary(x=>x);

当集合上的操作是包含/访问时,我们主要是这样做的,显然,在这种情况下,字典具有更好的性能。

但我意识到,将可枚举转换为字典有其自身的代价,我想知道它是从什么时候开始实现盈亏平衡的--也就是说,IEnumerable ToDictionary /access的性能等于 + access/contains.

好的,我可能补充说,没有数据库访问权限,枚举可能是从数据库查询创建的,这就是它,枚举也可以在此之后进行编辑。

另外,想知道键的数据类型对性能有什么影响呢?

一般情况下,查找可能是2-5次,但有时也是如此。但我已经看到了这样的情况:

代码语言:javascript
复制
 var element=Enumerable.SingleorDefault(x=>x.Id);
 //do something if element is null or return

一本字典:

代码语言:javascript
复制
 if(dictionary.ContainsKey(x))
 //do something if false else  return

这件事已经困扰我很长一段时间了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-07 08:55:17

字典的性能与IEnumerable的比较

当正确使用Dictionary时,读取速度总是更快(除非数据集非常小,例如10项)。创建它时可能会有开销。

给定m作为对同一个对象执行的查找量(它们是近似的):

m * O(n)).

  • IEnumerable的性能(从干净列表创建):O(mn)
    • --这是因为您每次都需要查看所有的项(本质上是
    • )

(O(n)).:DictionaryO(n) + O(1m)O(m + n)

  • 的性能--这是因为您需要首先插入项(DictionaryO(n) + O(1m))

通常可以看出,Dictionarym > 1时获胜,IEnumerablem = 1m = 0时获胜。

一般来说,你应该:

当对同一数据集进行多次查找时,

  • 使用Dictionary;在进行查找时,
  • 使用IEnumerable;当数据集太大,无法放入内存时,
  • 使用IEnumerable。请记住,SQL表可以像使用pressure.

一样使用,因此您可以使用它来抵消内存

进一步考虑

Dictionary使用GetHashCode()来组织内部状态。Dictionary的性能与哈希代码有两种强烈的关联。

  • 性能不佳的GetHashCode() --每次添加、查找或删除项时都会导致开销。
  • 低质量的哈希代码导致字典中没有O(1)查找GetHashCode()

大多数内置的.Net类型(特别是值类型)都有非常好的散列算法。但是,对于类似列表的类型(例如字符串),GetHashCode()具有O(n)性能,因为它需要遍历整个字符串。因此,您的字典的性能确实可以被看作是(其中M是一个有效的GetHashCode()):O(1) + M

票数 8
EN

Stack Overflow用户

发布于 2011-09-07 08:26:13

这取决于..。

IEnumerable多长时间?

访问IEnumerable会导致数据库访问吗?

它多久被访问一次?

最好的做法是做实验和分析。

票数 2
EN

Stack Overflow用户

发布于 2011-09-07 08:24:58

如果您经常通过某个键搜索集合中的元素,那么字典会更快,因为或者它的基于哈希的集合和搜索有时更快,否则如果不通过集合进行大量搜索--转换是不必要的,因为转换的时间可能比集合中的一两次搜索要大,

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7330802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档