Как изменяемые значения словаря должны быть проверены на равенство? - PullRequest
0 голосов
/ 22 января 2019

У меня есть следующий класс:

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 .

Итак, поэтому мой вопрос:

Как определить логику равенства для изменчивых объектов в случаях, подобных показанному выше, избегая проблем, присущих основанию хеш-кода объекта на изменяемых значениях?

...