2017-10-20 11 views
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(); 
      } 
     } 

    } 
} 

답변

3

귀하의 문제는 여기에 당신은 실제로 SameHash 클래스의 해시 코드 base.GetHashCode()를 반환하고

public override int GetHashCode(MyPairWithoutOverride i) 
{ 
    return base.GetHashCode(); 
} 

입니다. 따라서 실제로 매번 같은 해시 코드를 반환합니다.

i.GetHashCode()을 반환하면 예상대로 동작합니다.

+0

그래서 Collection이 실제로 수행하는 작업은 SameHash 클래스의 해시를 비교하는 것이므로 어쨌든 작동합니다. 알았다! 감사. – gviot