У меня есть два объекта, которые что-то вроде этого:Равные, но не взаимозаменяемы
class Container {
public HashSet<Item> Items { get; }
}
class Item {
public Container Parent { get; set; }
public string Value1 { get; set; }
public int Value2 { get; set; }
}
Каждый Item
экземпляр должен принадлежать к Container
, например, и есть один-ко-многим между ними, что всегда синхронизированы с обоих концов.
Теперь я сталкиваюсь с реализацией метода, который сравнивает два экземпляра Item
, чтобы узнать, соответствуют ли их значения Value1
и Value2
. Этот метод будет не учитывать значение Parent
, так как каждая пара экземпляров, которые я сравниваю, определенно отличается от этого значения, поэтому сделать этот метод будет бесполезным, так как тогда он будет иметь тот же результат (false
), что и object.ReferenceEquals
метод.
Мой вопрос заключается в следующем. Должен ли я реализовать этот метод как метод объекта public override bool Equals(object obj)
(вместе с GetHashCode
)? Или не исключает того, что он игнорирует его свойство Parent
? Почему или почему нет? Альтернативная идея, которую я имею, - это просто реализовать ее как public bool EqualsIgnoreParent(Item other)
, которая не отменяет ничего; Тогда я мог бы позвонить из пользовательского компаратора.
Это может быть беспорядочным, когда у вас есть значение равенства на изменяемом объекте, который вы помещаете в «HashSet», потому что для правильной работы хеш-код не должен меняться после его добавления в набор. –
Я предпочитаю использовать 'IEqualityComparer' для изменяемых объектов вместо переопределения' Equals'. – CodesInChaos
@CodesInChaos Да, это то, что я сделал. См. Мой ответ ниже. – HappyNomad