Мне нужно хешировать переменную-член вместо класса, поэтому я не проверяю, есть ли ссылка в словаре.Без переопределения значений по умолчанию он не найдет идентичный Value
, а вернет его, только если найдет тот же точный экземпляр HashedType
, такой, что этот код завершится ошибкой.
Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4
Определение 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);
}
}
}
Похоже, я могу переопределить GetHashCode () и Equals (), чтобы сделать это для меня.
Однако MSDN рекомендует создать отдельный класс, который я наследую от IEqualityComparer, и создать его экземплярмои словари использовали HashedType с HashedTypeComparer: IEqualityComparer.
Чтобы упростить это, я извлек из словаря и создал
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 сравнивался с этим единственным членом в любом случае.