【发布时间】:2010-12-10 03:42:10
【问题描述】:
在 .NET 中,Dictionary<TKey, TValue> 有一个构造函数,它采用一个参数 int capacity。这与List<T>、Queue<T> 和Stack<T> 等许多其他集合相同;另外,根据the MSDN documentation:
字典的容量是在需要调整大小之前可以添加到字典中的元素数。随着元素被添加到字典中,容量会根据需要通过重新分配内部数组来自动增加。
在我看来,这与 List<T> 等其他集合几乎相同。由于这些集合在必要时具有自动调整大小的行为,因此可能具有比所需更大的容量,因此它们中的大多数都具有 @ 987654329@ 方法。例如,如果您一次向集合中添加未知数量的项目,然后您将不再添加任何其他项目,这将非常方便。
为什么Dictionary<TKey, TValue> 没有同样的TrimExcess 方法?
(免责声明:我非常熟悉“默认情况下不存在功能”的响应;我想我主要是想知道TrimExcess 对Dictionary 没有意义是否有特殊原因,或者为什么它比 List 等更简单的集合更难实现。)
【问题讨论】:
-
由于
HashSet有一个TrimExcess方法并且在内部也可以使用一个HashTable,我认为没有技术上的理由不为Dictionary实现TrimExcess。他们甚至在文档中说HashSet就像没有值的Dictionary。 -
似乎与实现有关,因为 .NET Core 2.1 有 TrimExcess() docs.microsoft.com/en-us/dotnet/api/…
-
我假设 Microsoft 在 .NET Framework 2.0 中首次亮相时故意没有将
TrimExcess方法添加到Dictionary<K,V>,因为 .NET Framework 1.1 的System.Collections.Hashtable也没有类似的方法。调整List<T>/vector<T>或T[]数组的大小是微不足道的(因为现有的项目索引保持不变,所以简单的分配和复制工作正常),但调整哈希表的大小更困难,因为实际的哈希键需要根据负载因子重新计算。扩大哈希表的内部存储桶数组比缩小它更安全(由于冲突解决)。 -
...所以我认为 Microsoft 打算 开发人员通过替换并重新填充整个
Dictionary对象而不是允许来“缩小”Dictionary<K,V>要在内部调整大小的存储桶数组。
标签: .net collections dictionary