【发布时间】:2020-04-07 17:02:04
【问题描述】:
根据此解决方案 (https://stackoverflow.com/a/18923091/529618),我使用 ConcurrentDictionary<T,byte> 作为缺少 ConcurrentHashSet<T> 的解决方法。但是,我很想知道如何在 O(1) 时间内从字典中取出原始的 T Key。
var cache = new ConcurrentDictionary<MyEquatableClass, byte>());
//...
if(!cache.TryAdd(classInstance, Byte.MinValue))
return /* Existing cache entry */;
return classInstance;
有没有办法通过给它一个等效的(IEquatable)键来获取KeyValuePair<K,V>(甚至只是键)的ConcurrentDictionary<K,V>条目,而不用在O(n)时间内枚举它?
我的问题出现是因为我用作键的对象是IEquatable<K> 到另一个,而不是ReferenceEqual 到另一个。如果myDict.ContainsKey(someEquatable),我想获取字典中的原始键实例(以及与它一起存储的值),并丢弃我当前的(重复)实例。
【问题讨论】:
-
你看过
ConcurrentDictionary.GetOrAdd方法吗?是否也可以选择使用自定义IEqualityComparer而不是依赖类型的平等性? -
尝试检索您用作键的实际对象是一种不可靠的想法。
HashSet也不会真正让你这样做。正如您所发现的,解决方案是将键对象存储为值。如果值是引用类型,那么内存占用不会比使用byte时大。 -
阿兰你是对的,我误解了你的问题。关于劫持自定义相等比较器的
Equals方法,不,我不认为我会建议。这听起来太骇人听闻了。 :-) -
@JimMischel 不是
sizeof(byte)(1) 小于IntPtr.Size(4-8) 吗?还请查看HashSet.TryGetValue方法:在集合中搜索给定值并返回它找到的相等值(如果有)。 -
@JimMischel 你是对的!我刚刚测试了它,
Dictionary<MyClass,byte>与Dictionary<MyClass,MyClass>具有相同的内存占用(具有相同数量的项目)。
标签: c# data-structures concurrency concurrentdictionary