В моем текущем проекте я пытаюсь сравнить два списка объектов, выясняя, были ли добавлены, удалены, изменены или остались объекты.Поиск разницы между двумя списками
Я используя IEnumerable.Except
для этого следующим образом:
Dim newOnes = current.Except(previous, equalityComparer).ToList
Dim removedOnes = previous.Except(current, equalityComparer).ToList()
Dim existingOnes = current.Except(newOnes, equalityComparer).ToList
Dim changedOnes = existingOnes.Except(previous, changedComparer).ToList()
Dim unchangedOnes = existingOnes.Except(changedOnes, equalityComparer).ToList()
Для этого я должен реализовать IEqualityComparers.
Если вы обнаружили, что пара объектов изменилась в значениях свойств (changedOnes), мне нужно написать «changedComparer», который является IEqualityComparer, который проверяет не-идентификационные поля (такие как коллекции участников).
Как метод Except, по-видимому, сначала проверяет GetHashCode и не переходит к методу Equals, если хеши равны, моя установка разваливается.
Я в настоящее время решения это следующим образом:
Public Overloads Function GetHashCode(obj As Family) As Integer Implements IEqualityComparer(Of Family).GetHashCode
Dim hashCode As Long = 17
If obj.ClientCode IsNot Nothing Then hashCode = CInt(((hashCode * 397) Xor obj.ClientCode.GetHashCode()) Mod Integer.MaxValue)
' SNIP a bunch more property fields
If obj.Members IsNot Nothing Then hashCode = CInt(((hashCode * 397) Xor obj.Members.GetHashCode()) Mod Integer.MaxValue)
Return CInt(hashCode Mod Integer.MaxValue)
End Function
Добавление хэша списка членов, всегда возвращает другой хэш, как он проверяет экземпляр, а не содержание. Это работает пока, но с курса удаляет все преимущества наличия хэша.
UPDATE
Что я ищу это не лучше Equals метод, но я подвергаю сомнению всю свою методологию (может быть, есть что-то OOTB, я должен использовать другой интерфейс). В противном случае, как я могу получить хороший GetHashcode, когда необходимо учесть мою коллекцию имущества?
Я уже использую SequenceEqual в моей функции Equals. Проблема заключается в функции GetHashCode(). –