我知道当我创建一个自定义类作为键的字典时,我提供密钥时的匹配是通过引用比较完成的.例如:
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
}
Run Code Online (Sandbox Code Playgroud)
如果我在SomeClass
类中重写Equals(和==)会发生什么?我会在输出的第二行得到"30"吗?
如果我想要一个基于引用而不是成员值的字典,但是我已经覆盖了Equals,该怎么办?
谢谢!!
Jar*_*Par 11
是,如果您覆盖Equals
和GetHashCode
方法,您的自定义键比较将开始工作.
本Dictionary<TKey,TValue>
类并不一定做一个参考基础比较.它改为使用IEqualityComparer<TKey>
可以提供给构造函数的实例.如果未提供,则默认为EqualityComparer<T>.Default
.
工作的过程EqualityComparer<T>.Default
很复杂.但总结是
IEquatable<T>
类型,如果存在,则用于相等Equals
默认情况下的方法,Object.Equals
因此参考比较因此类型可以在几个级别覆盖比较
IEqualityComparer<T>
IEquatable<T>
和覆盖GetHashCode
Equals
和GetHashCode
等于运算符==
并且!=
不用于a中的TKey
类型Dictionary<TKey,TValue>
.
归档时间: |
|
查看次数: |
1117 次 |
最近记录: |