【发布时间】:2017-02-27 02:13:15
【问题描述】:
我需要维护一个数据库对象的缓存,这些对象是唯一键控的(按整数)。一个查询提供IEnumerable<MyEntity> 的实例(MyEntity 使用int 主键)和结果,我想尽快初始化Dictionary<int, MyEntity> 的实例,因为这个查询可以返回一些十万行。
从IEnumerable<MyEntity> 初始化Dictionary<int, MyEntity> 实例的最高效方法是什么?
简而言之,我想知道是否有更高效的方法来做到这一点:
IEnumerable<MyEntity> entities = DoSomeQuery();
var cache = new Dictionary<int, MyEntity>();
foreach (var entity in entities)
cache.Add(entity.Id, entity);
//or...
cache = entities.ToDictionary(e => e.Id);
当然,查询具有最大的潜在性能影响,但重要的是我尽可能为我的用例减少毫秒。
编辑:
在此值得注意的是,.ToDictionary<TKey, TElement>literally runs a foreach loop 与第一个示例一样,因此可以假设性能会完全相同,即使不是稍微差一点。也许这就是我的答案。
【问题讨论】:
-
你知道
ToDictionary扩展方法吗? -
可以提高性能的一件事是在构造过程中将枚举的长度作为容量传递给字典。
-
dictionary.Add包括检查密钥是否已经存在。如果您知道您正在插入好的数据,则可以将其替换为cache[key] = value。但是,不确定这对性能的影响 - 您需要对其进行衡量。 -
@Rob 执行完全相同的检查,但它只是覆盖现有项目而不是引发异常。没有性能提升。
-
@reduckted 再想一想 - 你是对的 - 因为无论如何它必须检查是否存在来处理冲突。
标签: c# performance dictionary