У меня есть сценарий, когда метод расширения IEnumerable.SequenceEqual
возвращает false, когда я этого не ожидал - если быть точным, при использовании его для сравнения двух наборов (известных идентичных) ILookup<int, int>
. Через отладчик я обнаружил, что фактические элементы в моих двух коллекциях являются экземплярами класса Lookup<TKey, TElement>.Grouping
, поэтому я погрузился в исходный источник.Почему Lookup <TKey, TValue>. Класс группировки не обеспечивает переопределения равенства?
Чтобы сократить длинный рассказ, сравнительный коэффициент равенства по умолчанию, используемый SequenceEqual
, равен ObjectEqualityComparer
, по умолчанию используется стандарт Object.Equals
. Но Lookup<TKey, TElement>.Grouping
не отменяет Equals
, поэтому ObjectEqualityComparer
заканчивает с использованием методы по умолчанию Object.Equals
, который вызывает в RuntimeHelpers.Equals
, которые (я предполагаю, так как это extern
) делает ссылочное сравнение и возвращают ложь.
Я не вижу веской причины, почему полужирная часть должна быть правдой, следовательно, этот вопрос. Кто-нибудь знает (или может объяснить), если это было преднамеренное дизайнерское решение (и если да, почему) - или это просто непреднамеренное упущение?
«... два экземпляра IEnumerable не равны только потому, что их элементы равны. Почему эта конкретная реализация IEnumerable будет отличаться?» Когда вы вкладываете его в эти термины, это имеет смысл. –