获取一个等于SortedDictionary项目的密钥?

时间:2011-05-16 10:08:34

标签: c# .net key sorteddictionary string-interning

有没有办法从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的内置集合实现这一目标?

3 个答案:

答案 0 :(得分:1)

您可以将值对象从int更改为包含值和原始键的结构或类。然后,您可以访问原始密钥:

dictionary[myIdenticalKey].OriginalKey

以及类似的值:

dictionary[myIdenticalKey].Value

答案 1 :(得分:0)

您可以在密钥类中实现IEquatable接口。在那里指定类的两个对象何时彼此相等。之后,您只需使用ContainsKey测试是否存在条目,当返回true时,您可以使用[]运算符获取该条目。

您还可以提供IComparer实施以获得相同的结果。

答案 2 :(得分:0)

如果您使用确定两个实例是否相同的代码覆盖Equals()中的GetHashCode()MyHugeType,那么您将无法在字典中获得重复的密钥。这是你的意思吗?