2
거의 동일한 두 클래스를 만들었습니다. 둘 다 Pair (x, y)를 나타내지 만, 그 중 하나에서 GetHashCode 및 Equals 메서드를 오버로드합니다. 나는 HashCode가 다르면 콜렉션은 그것들을 다른 요소로 취해 실제로 equals와 비교하는 것을 괴롭히지 않는다고 들었다. 그러나 GetHashCode 및 Equals를 재정의하지 않는 클래스에 대해 EqualityComparer를 구현했으며 HashCode가 여전히 다른 경우에도 모든 것이 올바르게 작동합니다. EqualityCompare 구현과 GetHashCode 및 Equals 구현 비교
내 콘솔 프로젝트에서보세요 :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();
}
}
}
}
그래서 Collection이 실제로 수행하는 작업은 SameHash 클래스의 해시를 비교하는 것이므로 어쨌든 작동합니다. 알았다! 감사. – gviot