У меня есть следующий класс:
public class Foo
{
public Guid Id { get; set; }
public string Bar { get; set; }
public DateTime Baz { get; set; }
}
И я хочу проверить это на равенство в словаре так:
var dict = new Dictionary<Guid, Foo>();
// Add some foos...
if (dict.ContainsValue(myFoo))
{
// Do something...
}
Где ContainsValue должен возвращать true для Foos, где свойства Bar и Baz равны тем, которые уже есть в словаре.
В документации ContainsValue указано, что используется EqualityComparer по умолчанию. Это говорит о том, что я могу реализовать интерфейс IEquatable и переопределить реализацию Equals по умолчанию следующим образом:
public override bool Equals(Foo obj)
{
return obj != null &&
Id.Equals(obj.Id) &&
Bar == obj.Bar &&
Baz == obj.Baz;
}
Это сообщение в блоге из MSDN предполагает, что при реализации IEquatable необходимо также переопределить функции Equals (object) и GetHashCode ().
Однако, если бы я использовал ту же логику равенства для функций Equals и GetHashCode, хэш-код объекта был бы основан на изменяемых полях, что рекомендуется в этом ответе StackOverflow .
Итак, поэтому мой вопрос:
Как определить логику равенства для изменчивых объектов в случаях, подобных показанному выше, избегая проблем, присущих основанию хеш-кода объекта на изменяемых значениях?