2008-11-23 127 views
1

我寫在C#中的IDictionary簡單抽象,它包裝一個 字典< K,ICollection的<V> >。基本上,它將多個值映射到一個鍵。當值列表中的最後一項被刪除時,我不能決定是否刪除一個鍵和它的空列表,或者保留它(以避免在鍵被重用時實例化一個新的集合)並檢查鍵的值Count當確定是否存在密鑰時。多重映射實現

回答

4

我會刪除集合,以便您的MultiMap具有一致的行爲。如果我使用了你的MultiMap,我會非常驚訝(並且很不高興)發現一個缺失的鍵的行爲有所不同,這取決於一個鍵以前是否在MultiMap中。

是否清除()刪除集合?

如果不刪除集合,您也可能會創建一個意外的內存泄漏。開發人員可能會添加許多項目,然後將其刪除。內存使用情況(GC之後)應該恢復到與添加這些項目前相同的數量。

我不擔心創建集合的成本。我擔心你爲MultiMap創建的合同。如果在分析你的應用程序後,你發現這是一個有關的問題,你可以修改或創建一個特殊的MultiMap的行爲。不要陷入過早優化的陷阱。

0

即使所有的值都被刪除,爲什麼不把它當作存在,並提供顯式的API來刪除密鑰?

0

這取決於您的使用模式。如果你要添加和刪除很多項目,那麼這些空集合將會佔用內存。我的猜測是,通過保留收藏品,你不會節省那麼多時間。與往常一樣,如果這對你的表現很重要,你應該測量而不是猜測哪種方式更好。

如果你真的認爲創建這些集合是昂貴的,那麼不要一直創建新集合,而是將未使用的集合放入列表中,並在新鍵值添加到散列表時重用它們。我認爲這可能是輕量級模式。您應該保留未使用的收藏列表小於主散列表大小的一半(同樣,衡量比例如何影響性能)。

2

在.NET 3.5中,有ILookup<TKey,TValue>Lookup<TKey,TValue>作爲多圖。內置實現(Lookup<TKey,TValue>)是不可改變的,但我在miscutil中編寫了EditableLookup<TKey,TValue>

在該版本中;是的 - 如果最後一項(使用該鍵)被刪除,我將刪除該鍵。這使得更容易查看哪些鍵存在(即.Keys等)。