【发布时间】:2015-02-27 09:39:53
【问题描述】:
我正在寻找是否存在适合原子化通用类型 T 的预先存在的 .Net 'Hash-Set type' 实现。我们有大量相同的对象用于需要被原子化以保存的序列化源记忆。
Dictionary<T,T> with the value == key 可以完美运行,但是这些集合中的对象在整个应用程序中可能会达到数百万个,因此为每个对象存储 2 个引用似乎非常浪费。
HashSet 不能使用,因为它只有包含,没有办法吗?获取实际的成员实例。
显然我可以自己滚动,但想检查是否有任何预先存在的东西。 C5 的扫描没有发现任何异常,但他们 250 多页的文档确实让我怀疑我是否遗漏了什么。
编辑 基本的想法是我需要能够 GET THE UNIQUE OBJECT BACK 即 HashSet 有 Contains(T obj) 但没有 Get(T obj) /编辑
最坏的集合只需要实现:
T GetOrAdd(T candidate)
void Clear()
并采用任意 IComparer 并且 GetOrAdd 是 ~O(1) 并且理想情况下是原子的,即不会浪费时间哈希两次。
编辑如果现有实现失败,我们将不胜感激有关基本散列/分桶机制的来源的任何建议。 - 已为此指出 Mono HashSet 源,因此本节已回答 /EDIT
【问题讨论】:
-
我通常使用
Dictionary<T, T>:-) 您可能只为每个元素浪费了 64 位(8 字节)的内存。 -
这可能是您正在寻找的:stackoverflow.com/questions/18922985/…。如果不是,请告诉我,我会重新打开。
-
@PatrickHofman 并发哈希集(以及使用 HashSet 实现它的所有示例)如何解决这个问题?
-
@xanatos:OP 只想向集合中添加一个实例,并以原子方式执行此操作(我猜是多线程)。这解决了这两个问题。
-
@tolanj:好的。没问题。
标签: c# .net collections hashset