从排序词典中获取与项目相等的键

本文关键字:项目 获取 排序 | 更新日期: 2023-09-27 17:56:48

有没有办法从 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的内置集合?

从排序词典中获取与项目相等的键

您可以将

值对象从 int 更改为同时包含值和原始键的结构或类。然后,要访问原始密钥,您可以执行以下操作:

dictionary[myIdenticalKey].OriginalKey

对于这样的值:

dictionary[myIdenticalKey].Value

如果使用确定两个实例是否相同的代码覆盖Equals()GetHashCode() MyHugeType,则不会在字典中获得重复的键。这是你的意思吗?

您可以在

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

您还可以提供IComparer实现以实现相同的结果。