[英]Implementing EqualityCompare vs overriding GetHashCode and Equals
I created two classes almost identical. 我创建了两个几乎完全相同的类。 Both represent a Pair (x,y) but in one of them I overrode the GetHashCode and Equals methods.
两者都表示一对(x,y),但是其中一个覆盖了GetHashCode和Equals方法。 I was told that when the HashCode is different the Collections takes them as different elements and does not even bother to actually compare them with the equals.
有人告诉我,当HashCode不同时,Collection将它们视为不同的元素,甚至不费心将它们与equals进行实际比较。 However, it turns out that I implemented an EqualityComparer for the class that do not override the GetHashCode and Equals and everything works fine even when the HashCodes are still different.
但是,事实证明,我为该类实现了一个EqualityComparer,该类不覆盖GetHashCode和Equals,即使HashCode仍然不同,一切也可以正常工作。
Take a look at my Console Project: 看一下我的控制台项目:
using System;
using System.Collections.Generic;
using System.Linq;
namespace matrixExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Same Hash but no insertion: as expected");
HashSet<MyPair> hash = new HashSet<MyPair>();
MyPair one = new MyPair { X = 10, Y = 2 };
MyPair copyOfOne = new MyPair { X = 10, Y = 2 };
Console.WriteLine(one.GetHashCode() + " " + hash.Add(one));
Console.WriteLine(copyOfOne.GetHashCode() + " " + hash.Add(copyOfOne));
Console.WriteLine("-----------------------------------------");
Console.WriteLine("Different Hash but no insertion! why?");
HashSet<MyPairWithoutOverride> hash2 = new HashSet<MyPairWithoutOverride>(new SameHash());
MyPairWithoutOverride a1 = new MyPairWithoutOverride { X = 10, Y = 2 };
MyPairWithoutOverride a1copy = new MyPairWithoutOverride { X = 10, Y = 2 };
Console.WriteLine(a1.GetHashCode() + " " + hash2.Add(a1));
Console.WriteLine(a1copy.GetHashCode() + " " + hash2.Add(a1copy));
}
public class MyPair
{
public int X { get; set; }
public int Y { get; set; }
public override int GetHashCode()
{
return X * 10000 + Y;
}
public override bool Equals(object obj)
{
MyPair other = obj as MyPair;
return X == other.X && Y == other.Y;
}
}
public class MyPairWithoutOverride
{
public int X { get; set; }
public int Y { get; set; }
}
public class SameHash : EqualityComparer<MyPairWithoutOverride>
{
public override bool Equals(MyPairWithoutOverride p1, MyPairWithoutOverride p2)
{
return p1.X == p2.X && p1.Y == p2.Y;
}
public override int GetHashCode(MyPairWithoutOverride i)
{
return base.GetHashCode();
}
}
}
}
Your problem is here 你的问题在这里
public override int GetHashCode(MyPairWithoutOverride i)
{
return base.GetHashCode();
}
You're returning base.GetHashCode()
which is actually the hash code of the SameHash
class. 您将返回
base.GetHashCode()
,它实际上是SameHash
类的哈希码。 So you actually are returning the same hash code every single time. 因此,实际上您每次都返回相同的哈希码。
If you return i.GetHashCode()
then it will behave as expected. 如果返回
i.GetHashCode()
则它将按预期运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.