我需要针对成员变量进行哈希,而不是类本身,这样我就不需要检查引用是否在字典中。如果不覆盖默认值,则它将无法找到相同的Value
,但仅在找到完全相同的HashedType
实例时返回,因此此代码会失败。
Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4
哈希类型的定义:
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);
}
}
}
看起来我可以覆盖GetHashCode()和Equals()方法来实现这个目的。
然而,MSDN建议我创建一个单独的类,该类从IEqualityComparer派生,并使用HashedTypeComparer:IEqualityComparer来实例化我的用于HashedType的字典。
为了使这更容易,我从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(); }
}
这一切似乎都是刻意安排的。
我唯一得到的优势是不需要改变Equals()函数吗?
我的意思是,说真的,我希望Equals()函数只比较那个单一成员。