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能够与那个单一成员进行比较.
这个想法是,这object.Equals
是该类型的自然平等(并且GetHashCode
应该与平等的想法相匹配)。IEqualityComparer
当您希望根据具体情况获得不同的相等性时使用。
例如,考虑一个string
. 重写的Equals
&GetHashCode
方法进行区分大小写的比较。但是,如果您想要一个键不区分大小写的字典怎么办?您编写一个IEqualityComparer
不区分大小写的值并将其传递到字典的构造函数中。
您的示例听起来像是如果成员相等,则任何两个实例HashedType
通常都会被视为相等。在这种情况下,我建议重写object.Equals
和object.GetHashCode
方法,而不是编写IEqualityComparer
.