如何使用键和值'Equals方法比较两个KeyValuePairs?

时间:2018-02-15 19:39:08

标签: c#

请考虑以下代码:

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方法。

我该如何实现?

1 个答案:

答案 0 :(得分:3)

覆盖Equals方法

public override bool Equals(object obj)
{
    MyClass other = obj as MyClass;

    return other != null &&
           MyProperty == other.MyProperty;
}

编辑:正如评论中所提到的,每当您覆盖Equals方法时,您还希望覆盖GetHashCode方法。如果不这样做,将导致在重写的Equals方法上显示warning,以及其他问题。