Выбор ответа Middle Коллекции и LINQ обновлено

Изменяемый ключ в HashSet

Вопрос

Объект класса с переопределёнными Equals/GetHashCode по полю Name положили в HashSet, затем поменяли Name. Что вернёт set.Contains(obj)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Скорее всего false: объект лежит в бакете по старому хешу. Хеш вычисляется при добавлении, и элемент кладётся в соответствующий бакет.

Варианты ответа

  1. Всегда true: HashSet сравнивает объекты по ссылке
  2. Скорее всего false: объект лежит в бакете по старому хешуправильный ответ
  3. InvalidOperationException в момент изменения свойства Name
  4. true: HashSet пересчитывает хеши при каждом поиске

Разбор

Хеш вычисляется при добавлении, и элемент кладётся в соответствующий бакет. После изменения поля новый хеш указывает в другой бакет, где объекта нет, поэтому Contains почти всегда вернёт false (совпасть может только случайно). При этом объект остаётся в коллекции, и его даже не удалить через Remove. Ключи хеш-коллекций должны быть неизменяемыми.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.