【问题标题】:Where is Dictionary<,>.SetCapacity(int newCapacity)?Dictionary<,>.SetCapacity(int newCapacity) 在哪里?
【发布时间】:2013-03-14 16:27:22
【问题描述】:

如果我想一次向Dictionary 添加大量项目并且我提前知道(粗略)数字,那么如果我使用适当的设置初始容量,它在内存和 cpu 方面会更快更高效构造函数重载。

在我测试的情况下,使用 300.000 个条目,如果我将 Dictionary 的容量设置为 300.000,它比未初始化时快约 25%。

现在,如果我有一个已经构建但已清空的字典,我需要填充大量项目,我该怎么办?假设这是例如readonly 变量,我无法使用新的 Dictionary 实例重新分配该变量。我在文档中看不到任何影响已经构建的 Dictionary 容量的东西。像例如Clear(int newInitialCapacity) 会很好。

我运气不好?

【问题讨论】:

  • 使用this构造函数指定初始大小有什么问题?
  • @TimSchmelter 他已经构建了一个字典,我想他想重新使用它。
  • 模拟Clear(int capacity)的唯一方法是通过反射调用private void Initialize(int capacity)
  • 在我看来真的很奇怪,您使用的是只读字典,您无法影响哪个实例化。如果不是出于教育目的,您拥有的真实案例是什么?只是好奇。
  • @SergeyS readonly 有几个好处,例如使对象本身可用作 lockObj,不必检查 null 等。除此之外,假设您处于这种情况,如您可能正在使用无法更改的库或不想更改的代码。

标签: .net dictionary


【解决方案1】:

您声明“在文档中没有看到任何影响已构建字典容量的内容”。

根据文档,容量不会在清除时重置。

Dictionary.Clear Method

Count 属性设置为 0,并且对其他对象的引用来自 该系列的元素也被释放。容量还在 不变。

您有一本词典,其中包含超过 300,000 个项目和性能调整,但您没有新词典的选项?

可能值得一试 KeyCollection,因为您可以覆盖 ClearItems。

KeyedCollection.ClearItems Method

在 HashSet 上有一个 TrimExcess。

HashSet.TrimExcess Method

【讨论】:

    【解决方案2】:

    看起来答案是:是的,我不走运。已经构建的字典的容量不能改变,当然除了通过逐个添加元素来递增。

    如果 .net 的 Dictionary 有一个类似于 Java 的 putAllAddAll(..) 方法,那么我可以将其留给 Dictionary 实现者的聪明才智。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多