首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ ToDictionary初始容量

LINQ ToDictionary初始容量
EN

Stack Overflow用户
提问于 2012-05-29 22:39:12
回答 5查看 1.1K关注 0票数 1

我经常使用LINQ扩展方法ToDictionary,但我想知道它的性能。没有参数来定义字典的容量,对于100k或更多条目的列表,这可能会成为一个问题:

代码语言:javascript
复制
IList<int> list = new List<int> { 1, 2, ... , 1000000 };
IDictionary<int, string> dictionary = list.ToDictionary<int, string>(x => x, x => x.ToString("D7"));

实现是否实际接受list.Count并将其传递给字典的构造函数?或者字典的大小调整足够快了,所以我真的不用担心了?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-29 22:51:20

实现是否实际接受list.Count并将其传递给字典的构造函数?

不是的。根据ILSpy的说法,实现基本上是这样的:

代码语言:javascript
复制
Dictionary<TKey, TElement> dictionary = new Dictionary<TKey, TElement>(comparer);
foreach (TSource current in source)
{
    dictionary.Add(keySelector(current), elementSelector(current));
}
return dictionary;

如果你profile你的代码,并确定ToDictionary操作是你的瓶颈,那么基于上面的代码创建你自己的函数是微不足道的。

票数 2
EN

Stack Overflow用户

发布于 2012-05-29 22:43:19

实现是否实际接受list.Count并将其传递给字典的构造函数?

这是一个实现细节,对你来说不应该很重要。

还是字典的大小调整够快了,所以我真的不用担心了?

嗯,我不知道。只有您知道这是否真的是应用程序中的瓶颈,以及性能是否可接受。如果你想知道它是否足够快,编写代码并计时。就像Eric Lippert常说的那样,如果你想知道两匹马有多快,你是让它们比赛,还是在互联网上随便问陌生人哪一匹更快?

也就是说,我真的很难想象这会成为任何实际应用程序的瓶颈。如果向字典中添加条目是应用程序中的瓶颈,那么您做错了什么。

票数 2
EN

Stack Overflow用户

发布于 2012-05-29 22:45:17

我不知道如何调整字典的大小,但是使用dotPeek.exe检查实现表明实现没有使用列表长度。

这段代码主要做的是:

创建新的dictionary

  • iterate over sequence和add items

如果您发现这是一个瓶颈,那么创建您自己的扩展方法ToDictionaryWithCapacity将是微不足道的,它可以在不迭代整个东西的情况下实际计算其长度。

刚刚扫描了Dictionary实现。基本上,当它开始填满时,内部列表通过将其大致加倍为接近质数来调整大小。所以这种情况不应该发生得太频繁。

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

https://stackoverflow.com/questions/10801352

复制
相关文章

相似问题

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