Necesito hash contra una variable miembro en lugar de la clase, por lo que no compruebo si la referencia está en el diccionario. Sin anular los valores predeterminados, no encontrará un Value
idéntico, pero solo devolverá si encuentra la misma instancia exacta de HashedType
, de modo que este código falla.Ventaja de derivar la clase externa de IEqualityComparer <> sobre la anulación GetHashCode e Igual
Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4
Definición de 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);
}
}
}
Parece que puedo reemplazar GetHashCode() y equals() para hacer esto por mí.
Sin embargo, MSDN recomienda que cree una clase separada que proceda de IEqualityComparer y crear instancias de mis diccionarios utilizando HashedType con HashedTypeComparer: IEqualityComparer.
para ayudar a hacer esto más fácil, he derivado de diccionario y creé
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(); }
}
todo esto parece artificial.
¿La única ventaja que obtengo es que no cambie Equals()?
Quiero decir, realmente hablando, me gustaría que Equals se compare contra ese único miembro de todos modos.