请考虑以下代码:
var a = new KeyValuePair<int, int>(1, 1);
var b = new KeyValuePair<int, int>(1, 1);
Console.WriteLine(a.Equals(b));
输出:
真
但是,如果我尝试这段代码:
class MyClass : IEquatable<MyClass>
{
public MyClass(int myProperty)
{
MyProperty = myProperty;
}
public int MyProperty { get; private set; }
public bool Equals(MyClass other)
{
return other != null &&
MyProperty == other.MyProperty;
}
}
.
.
.
var a = new KeyValuePair<int, MyClass>(1, new MyClass(1));
var b = new KeyValuePair<int, MyClass>(1, new MyClass(1));
Console.WriteLine(a.Equals(b));
然后输出是:
假
我的结论是,由于键是值类型,因此它们按值进行比较,并且由于值是引用类型,因此它们通过引用进行比较。
我想比较KeyValuePair
,以便将值(以及键)与值进行比较 - 即使用我提供的Equals
方法。
我该如何实现?
答案 0 :(得分:3)
覆盖Equals方法
public override bool Equals(object obj)
{
MyClass other = obj as MyClass;
return other != null &&
MyProperty == other.MyProperty;
}
编辑:正如评论中所提到的,每当您覆盖Equals方法时,您还希望覆盖GetHashCode方法。如果不这样做,将导致在重写的Equals方法上显示warning,以及其他问题。