Преимущество получения внешнего класса из IEqualityComparer <> по сравнению с переопределением GetHashCode и Equals

Мне нужно хешировать переменную-член вместо класса, поэтому я не проверяю, есть ли ссылка в словаре . Без переопределения значений по умолчанию он не найдет идентичного 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.

Чтобы упростить эту задачу, я позаимствовал из 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 все равно сравнивал с этим единственным членом.

5
задан Lee Louviere 22 February 2012 в 18:57
поделиться