2017-10-20 76 views
2

我创建了两个几乎完全相同的类。两者都表示一个Pair(x,y),但在其中一个中我覆盖了GetHashCode和Equals方法。有人告诉我,当HashCode不同时,集合将它们作为不同的元素,甚至不打算将它们与等号进行比较。然而,事实证明,我为这个类实现了一个EqualityComparer,它不覆盖GetHashCode和Equals,即使HashCodes仍然不同,一切正常。实现EqualityCompare vs覆盖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

你的问题是在这里

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

你返回base.GetHashCode()这实际上是SameHash类的哈希码。所以你实际上每次都会返回相同的散列码。

如果您返回i.GetHashCode()那么它将按预期行事。

+0

因此,Collection实际上在做什么是比较SameHash类的哈希值,这就是为什么它可以工作。得到它了!谢谢。 – gviot

相关问题