有没有办法从SortedDictionary中检索一个等于给定对象的键?为了说明,假设我创建了一个具有相当大量内存,不可变密钥类型的字典:
var dictionary = SortedDictionary<MyHugeType, int>();
var myEnormousKey = new MyHugeType();
dictionary[myEnormousKey] = 123;
然后,我会做这样的事情:
// This is a new instance, but it's identical to the previous key
var myIdenticalKey = new MyHugeType();
if(dictionary.ContainsKey(myIdenticalKey)) {
myIdenticalKey = dictionary.GetKeyEqualTo(myIdenticalKey);
}
// Use myIdenticalKey reference...
显然,SortedDictionary没有“GetKeyEqualTo”方法。但是有什么方法可以达到类似的效果吗?这基本上具有实施重密钥对象的效果,从而可以丢弃相同的实例。我知道我可以使用SortedList类通过检索键的索引以及随后的匹配对象实例来做到这一点,但SortedDictionary的一致插入性能对我的用途会更好。
没有迭代遍历所有字典的键来搜索匹配,或编写我自己的BST类,有没有办法用.NET的内置集合实现这一目标?
答案 0 :(得分:1)
您可以将值对象从int更改为包含值和原始键的结构或类。然后,您可以访问原始密钥:
dictionary[myIdenticalKey].OriginalKey
以及类似的值:
dictionary[myIdenticalKey].Value
答案 1 :(得分:0)
您可以在密钥类中实现IEquatable
接口。在那里指定类的两个对象何时彼此相等。之后,您只需使用ContainsKey
测试是否存在条目,当返回true
时,您可以使用[]
运算符获取该条目。
您还可以提供IComparer
实施以获得相同的结果。
答案 2 :(得分:0)
如果您使用确定两个实例是否相同的代码覆盖Equals()
中的GetHashCode()
和MyHugeType
,那么您将无法在字典中获得重复的密钥。这是你的意思吗?