【问题标题】:What would be too big for a dictionary, when using IEnumerable.ToDictionary()?当使用 IEnumerable.ToDictionary() 时,对于字典来说什么会太大?
【发布时间】:2012-06-04 22:19:14
【问题描述】:

也就是说,在我的方法中,我传入了几个 IEnumerables(可能是因为我要从数据库或其他东西中获取一堆对象)。

然后对于objects1中的每个对象,我想从objects2中提取一个具有相同object.iD的diffobject。

我不想要多个枚举(根据 resharper),所以我可以将 objects2 变成一个以 object.iD 为键的字典。然后我只为每个枚举一次。 (第二个问题)这是一个好的模式吗?

(主要问题)什么太大了?这在什么时候会是一个可怕的模式?多少个对象对于字典来说是太多对象?

【问题讨论】:

  • 也许在尝试优化尚不存在的东西之前先试一试,看看是否真的有问题?

标签: c# performance design-patterns dictionary ienumerable


【解决方案1】:

在内部,它将被阻止拥有超过 20 亿个项目。由于事物在字典中的定位方式相当复杂,如果我正在处理十亿个项目(例如,如果是 16 位值,则为 2GB),我希望将它们存储在数据库中并使用数据访问代码检索它们。

我不得不问,Objects1 和 Objects2 是从哪里来的?听起来您可以在 DB 级别执行此操作,而且比在 C# 中执行此操作要高效得多!

您可能还想考虑使用 KeyValuePair[]

【讨论】:

    【解决方案2】:

    字典存储 KeyValuePair 的实例

    如果您只想在字典中查找给定 Key 的值,那么是的,Dictionary 是您的最佳选择 - 他们很快就能做到这一点。但是,如果您想使用Value 或其属性对项目进行排序或搜索,最好使用use something else

    就大小而言,它们会随着变大而变慢,值得做一些基准测试以了解它如何影响您的需求,但您始终可以根据它们的类型或范围在多个字典中拆分值。 http://www.dotnetperls.com/dictionary-size

    值得注意的是,当您说“然后我只为每个枚举一次”时,这有点不正确。 objects1 将被完整枚举,但objects2 的字典不会被枚举。只要您使用Key 来检索值,它就会散列键并使用结果来计算存储值的位置,因此字典可以很快地获取您要求的值。理想情况下,Key 使用 int,因为它可以直接将其用作散列。您可以枚举它们,但最好使用objects2Dictionary[key] 查找对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2010-10-17
      • 2013-06-15
      相关资源
      最近更新 更多