Многие удивляются: почему
list1.Equals(list2) возвращает false, даже если содержимое одинаковое?Это не баг и не лень. Это осознанное решение.
Причина 1: равенство коллекций неоднозначно
[1, 2, 3] и [3, 2, 1] — равны? Зависит от задачи:— порядок важен → нет
— порядок не важен → да
— разные типы (List vs Stack) → может быть
Нет одного правильного ответа, поэтому язык не навязывает ни один.
Причина 2: производительность
Равенство ссылок — O(1).
Сравнение по содержимому — O(n) или O(n log n).
В ранние годы C# строился на скорости.
Причина 3: мутабельность всё ломает
Допустим, вы сравнили два списка, получили true, сохранили флаг. Потом кто-то добавил элемент в один из них. Флаг стал false. равеноство на изменяемых объектах концептуально сломано.
Как правильно
Реализуйте
IEqualityComparer<IEnumerable<T>> под свою задачу:—
SequenceComparer — порядок важен —
ContentComparer — порядок не важен Вы сами выбираете семантику. Язык не угадывает за вас.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор