Выбор ответа Middle Коллекции и LINQ обновлено
Изменяемый ключ в HashSet
Вопрос
Объект класса с переопределёнными Equals/GetHashCode по полю Name положили в HashSet, затем поменяли Name. Что вернёт set.Contains(obj)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Скорее всего false: объект лежит в бакете по старому хешу. Хеш вычисляется при добавлении, и элемент кладётся в соответствующий бакет.
Варианты ответа
- Всегда
true:HashSetсравнивает объекты по ссылке - Скорее всего
false: объект лежит в бакете по старому хешуправильный ответ InvalidOperationExceptionв момент изменения свойстваNametrue:HashSetпересчитывает хеши при каждом поиске
Разбор
Хеш вычисляется при добавлении, и элемент кладётся в соответствующий бакет. После изменения поля новый хеш указывает в другой бакет, где объекта нет, поэтому Contains почти всегда вернёт false (совпасть может только случайно). При этом объект остаётся в коллекции, и его даже не удалить через Remove. Ключи хеш-коллекций должны быть неизменяемыми.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.