我正在用C#编写一个简单的IDictionary抽象 字典< K,ICollection< V>>。基本上,它将多个值映射到一个键。当删除值列表中的最后一项时,我无法决定是删除键及其空列表,还是保留它(以避免在重用键时实例化新的集合)并检查键的值'Count在确定密钥是否存在时。
答案 0 :(得分:4)
我会删除集合,以便您的MultiMap具有一致的行为。如果我使用你的MultiMap,我会非常惊讶(并且不高兴)发现丢失的键的行为会有所不同,具体取决于某个键以前是否在MultiMap中。
Clear()是否删除了集合?
如果不删除集合,也可能会创建意外的内存泄漏。开发人员可以添加许多项目,然后将其删除。内存使用情况(在GC之后)应该返回与添加这些项目之前相同的数量。
我不担心创建集合的成本。我会担心您为MultiMap创建的合同。如果在对应用程序进行概要分析后发现了相关问题,则可以为该行为修改或创建特殊的MultiMap。不要陷入过早优化的陷阱。
答案 1 :(得分:2)
在.NET 3.5中,ILookup<TKey,TValue>
和Lookup<TKey,TValue>
充当多地图。内置实现(Lookup<TKey,TValue>
)是不可变的,但我在miscutil中编写了EditableLookup<TKey,TValue>
。
在那个版本中;是 - 如果最后一项(使用该键)被删除,我将删除密钥。这样可以更容易地查看存在哪些键(即.Keys
等)。
答案 2 :(得分:0)
为什么即使删除了所有值,也不会将密钥视为存在,并提供用于删除密钥的显式API?
答案 3 :(得分:0)
这取决于您的使用模式。如果您要添加和删除大量项目,那么这些空集合将耗尽内存。我的猜测是,你不会通过保持收藏来节省那么多时间。和往常一样,如果它对你的表现很重要,你应该衡量而不是猜测哪种方式更好。
如果你真的认为创建这些集合很昂贵,那么不要一直创建新集合,而是将未使用的集合放入列表中,并在新键添加到hashmap时重用它们。我认为这可能是轻量级模式。您可能应该将未使用的集合列表保持不到主hashmap大小的一半(再次,测量以查看该比率如何影响性能)。