我寫在C#中的IDictionary簡單抽象,它包裝一個 字典< K,ICollection的<V> >。基本上,它將多個值映射到一個鍵。當值列表中的最後一項被刪除時,我不能決定是否刪除一個鍵和它的空列表,或者保留它(以避免在鍵被重用時實例化一個新的集合)並檢查鍵的值Count當確定是否存在密鑰時。多重映射實現
Q
多重映射實現
1
A
回答
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
等)。
相關問題
- 1. VBA映射實現
- 2. Dapper多重映射
- 3. C++函數映射實現
- 4. 實現字符串映射
- 5. NHibernate的實體多映射
- 6. 多重映射累積值
- 7. 訪問多重映射值
- 8. 分佈式多重映射
- 9. dapper.net中的多重映射
- 10. JPA映射:多重關係
- 11. Hibernate將接口映射爲具有多個實現的實體
- 12. Hibernate映射:實體映射中的重複列
- 13. 多線程與多重映射
- 14. 映射實體
- 15. 實體映射
- 16. 可變的多重映射到不可變的映射
- 17. ASP.NET MVC - 在哪裏實現映射器?
- 18. 用java實現通用映射
- 19. 高效的不可變映射實現?
- 20. WSCallHelper.jdbcCall WAS 8.5的XMLType映射實現
- 21. NHibernate映射 - 如何實現這個
- 22. 爲沒有鍵的映射實現entrySet
- 23. 實現兩個哈希映射
- 24. 如何實現排隊映射?
- 25. JavaScript哈希映射如何實現?
- 26. Ninject映射的無參數實現
- 27. 增強現實 - 將GPS映射到OpenGL
- 28. 實現log4net csv映射時獲取TargetParameterCountException
- 29. 有序通用映射的實現?
- 30. 自組織映射(SOM)的實現