docs.Sort((x, y) => -x.StoredDate.CompareTo(y.StoredDate));
Примечание знак "минус".
Проблема глубоких и мелких равных больше, чем Java; все объектно-ориентированные языки должны заниматься этим.
Объекты, которые вы добавляете в коллекцию, должны переопределять equals и хеш-код, но поведения по умолчанию, встроенного в абстрактную реализацию интерфейса коллекции, достаточно для самой коллекции.
Я думаю, что больший вопрос в том, что должно произойти, если кто-то попытается добавить экземпляр вашей FredCollection в набор дважды.
FredCollection c = ...
set.add(c);
set.add(c);
Должен ли size()
из set
быть 2
или 1
после этого?
Вам когда-нибудь понадобится проверить «равенство» двух разных случаев FredCollection
? Я думаю, что ответ на этот вопрос важнее при определении вашего поведения equals()
/ hashcode()
, чем что-либо еще.
Не следует переопределять equals и hashCode, чтобы они отражали изменяемый член.
Это скорее моя личная точка зрения. Я думаю, что хеш-код и равнозначные являются техническими терминами, которые не должны использоваться для реализации бизнес-логики. Представьте себе: у вас есть два Объекта (не только Коллекции) и спросите, равны ли они, тогда есть два различных способа ответить на них:
Но так как equals используется техническими средствами (HashMap), вы должны реализовать его техническим способом и построить связанные с бизнесом логики equals с помощью что-то еще (что-то вроде интерфейса компаратора). А для вашей коллекции это означает: не переопределяйте equals и hashCode (таким образом, что нарушает технический контракт:
Примечание: следует соблюдать особую осторожность, если в качестве ключей карты используются изменяемые объекты. Поведение карты не указывается, если значение объекта изменяется таким образом, что это влияет на сравнение на основе равных, в то время как объект является ключом на карте.
(java doc of Map)).
equals используется для добавления / удаления элементов из коллекций, таких как CopyOnWriteArraySet, HashSet, если hashCode равен для двух разных объектов и т. Д. Equals должен быть симметричным, т. Е. Если B.equals (C) возвращает true, то C.equals (B) должен вернуть тот же результат. В противном случае ваши добавления / удаления на этих наборах XXX ведут себя непонятно. Проверьте Переопределение равно для CopyOnWriteArraySet.add и удалите , как неправильное переопределение равно влияет на операции добавления / удаления для коллекций