【发布时间】:2008-11-23 02:38:32
【问题描述】:
我正在用 C# 编写一个简单的 IDictionary 抽象,它包含一个
字典
【问题讨论】:
标签: .net performance data-structures collections
我正在用 C# 编写一个简单的 IDictionary 抽象,它包含一个
字典
【问题讨论】:
标签: .net performance data-structures collections
我会删除集合,以便您的 MultiMap 具有一致的行为。如果我使用您的 MultiMap,我会非常惊讶(并且不高兴)发现缺少的键的行为会有所不同,具体取决于键之前是否在 MultiMap 中。
Clear() 是否删除集合?
如果您不删除集合,也可能会造成意外的内存泄漏。开发人员可能会添加许多项目,然后将其删除。内存使用量(GC 之后)应该恢复到与添加这些项目之前相同的数量。
我不会担心创建集合的成本。我会担心您为 MultiMap 创建的合同。如果在分析您的应用程序后您发现这是一个问题,您可以为该行为修改或创建一个特殊的 MultiMap。不要陷入过早优化的陷阱。
【讨论】:
在 .NET 3.5 中,ILookup<TKey,TValue> 和 Lookup<TKey,TValue> 充当多映射。内置实现(Lookup<TKey,TValue>)是不可变的,但我在miscutil 中写了一个EditableLookup<TKey,TValue>。
在那个版本中;是的-如果删除了最后一项(带有该密钥),我将删除该密钥。这样可以更轻松地查看存在哪些键(即.Keys 等)。
【讨论】:
为什么即使所有值都被删除,也不将密钥视为存在,并提供用于删除密钥的显式 API?
【讨论】:
这取决于您的使用模式。如果您要添加和删除大量项目,那么这些空集合将耗尽内存。我的猜测是你不会通过保留收藏来节省那么多时间。与往常一样,如果它对您的表现如此重要,您应该衡量而不是猜测哪种方式更好。
如果您真的认为创建这些集合很昂贵,那么不要一直创建新集合,而是将未使用的集合放入一个列表中,并在将新键添加到您的 hashmap 时重用它们。我认为这可能是蝇量级模式。您可能应该将未使用的集合列表保持在小于主 hashmap 大小的一半(再次测量该比率如何影响性能)。
【讨论】: