通过覆盖GetHashCode和Equals从IEqualityComparer <>派生外部类的优点

Lee*_*ere 5 c# hash dictionary

我需要对成员变量而不是类进行散列,所以我不检查引用是否在字典中.如果没有覆盖默认值,它将找不到相同的Value,但只有在找到相同的确切实例时才返回HashedType,这样代码就会失败.

Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4
Run Code Online (Sandbox Code Playgroud)

HashedType的定义:

HashedType
{
   public HashedType(Int32 value) { Value = value); }
   public HashedType(String value) { Value = value); }
   public object Value;
   public void Serialize(Serializer s)
   {
      if (Value.GetType() == typeof(Int32)) 
      {
         s.Set<Int32>(0);
         s.Set<Int32>(Value);
      }
      else 
      {
         s.Set<Int32>(1);
         s.Set<String>(Value);
      }

   }
}
Run Code Online (Sandbox Code Playgroud)

看起来我可以覆盖GetHashCode()和Equals()为我这样做.

但是,MSDN建议我创建一个单独的类,我从IEqualityComparer派生并实例化我的字典使用HashedType和HashedTypeComparer:IEqualityComparer.

为了使这更容易,我从Dictionary中派生并创建

HashedTypeDictionary<U> : Dictionary<T,U> 
{ 
   public HashedTypeDictionary() : base(new  HashedTypeComparer()) { } 
   public bool Equals(HashedType a, HashedType b) { return a.Value == b.Value; }
   publci int GetHashCode(HashedType a) { return a.Value.GetHashCode(); } 
}
Run Code Online (Sandbox Code Playgroud)

这一切似乎都是人为的.

我获得的唯一优势是不改变Equals()?

我的意思是,实际上,我希望Equals能够与那个单一成员进行比较.

R. *_*des 4

这个想法是,这object.Equals是该类型的自然平等(并且GetHashCode应该与平等的想法相匹配)。IEqualityComparer当您希望根据具体情况获得不同的相等性时使用。

例如,考虑一个string. 重写的Equals&GetHashCode方法进行区分大小写的比较。但是,如果您想要一个键不区分大小写的字典怎么办?您编写一个IEqualityComparer不区分大小写的值并将其传递到字典的构造函数中。

您的示例听起来像是如果成员相等,则任何两个实例HashedType通常都会被视为相等。在这种情况下,我建议重写object.Equalsobject.GetHashCode方法,而不是编写IEqualityComparer.