我知道当我使用自定义类作为键创建字典时,我提供键时的匹配是通过引用比较完成的。例如:
public class SomeClass
{
public object SomeValue { get; set; }
}
// ....
public static void Main()
{
var dict = new Dictionary<SomeClass, string>();
var key1 = new SomeClass { SomeValue = 30 };
dict[key1] = "30";
Console.WriteLine(dict[key1]); // prints "30"
var key2 = new SomeClass { SomeValue = 30 };
Console.WriteLine(dict[key2]); // prints null
}
如果我在
SomeClass
中覆盖 Equals(和 ==)会发生什么类(class)?我会在输出的第二行得到“30”吗?如果我想要一个基于引用而不是成员值的字典,但我已经覆盖了 Equals,该怎么办?
谢谢!!
最佳答案
简答
是,如果您覆盖 Equals
和 GetHashCode
方法您的自定义键比较将开始工作。
长答案Dictionary<TKey,TValue>
class 不一定会进行基于引用的比较。它改为使用 IEqualityComparer<TKey>
可以提供给构造函数的实例。如果未提供,则默认值为 EqualityComparer<T>.Default
.EqualityComparer<T>.Default
的过程作品复杂。但总结是
IEquatable<T>
在类型上,如果存在则用于相等 Equals
方法默认为 Object.Equals
因此引用比较 所以类型可以覆盖几个级别的比较
IEqualityComparer<T>
IEquatable<T>
和覆盖 GetHashCode
Equals
和 GetHashCode
相等运算符
==
和 !=
对 TKey
不起作用输入 Dictionary<TKey,TValue>
.
关于.Net 字典和等号的覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4262027/