I’m need to hash against a member variable instead of the class, so I don’t check if the reference is in the dictionary. Without overriding the defaults, it won’t find an identical Value, but only return if it finds the same exact instance of HashedType, such that this code fails.
Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4
Definition of 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);
}
}
}
It looks like I can override GetHashCode() and Equals() to do this for me.
However, MSDN recommends I create a separate class that I derive from IEqualityComparer and instantiate my dictionaries used HashedType with the HashedTypeComparer : IEqualityComparer.
To help make this easier, I’ve derived from Dictionary and created
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(); }
}
This all seems contrived.
Is the only advantage I get is not changing the Equals()?
I mean, really speaking, I would want Equals to compare against that single member anyway.
The idea is that
object.Equalsis the natural equality for that type (andGetHashCodeshould match that idea of equality).IEqualityCompareris used when you want a different equality on a case-by-case basis.Consider for example, a
string. The overriddenEquals&GetHashCodemethods do case-sensitive comparisons. But what if you want a dictionary where the keys are not case-sensitive? You write anIEqualityComparerthat is not case-sensitive and pass it in the constructor of the dictionary.Your examples sounds like any two instances of
HashedTypeare to be normally treated as equal if their members are equal. In that case I’d recommend overriding theobject.Equalsandobject.GetHashCodemethods and not writing aIEqualityComparer.