Согласование порядка и хеш-кода в C#
Классы HashSet и Dictionary сначала выбирают ячейку по хеш-коду,
и только потом вызывают Equals. Если равные объекты дают разные хеши,
элемент теряется: поиск смотрит не в ту ячейку.
Правило простое: переопределили равенство - переопределите GetHashCode из тех же
полей, что участвуют в Equals. Хеш обычного объекта у двух одинаковых
меток разный, поэтому поиск их не встретит.
Проверим поиск метки в множестве при согласованных методах. Значение
true подтверждает, что второй объект нашёлся, потому что хеш
совпал и Equals вернул равенство:
HashSet<Label> set = new HashSet<Label> { new Label("ok") };
Console.WriteLine(set.Contains(new Label("ok")));
sealed class Label
{
public string Text { get; }
public Label(string text) => Text = text;
public override bool Equals(object? obj) =>
obj is Label other && other.Text == Text;
public override int GetHashCode() =>
Text.GetHashCode(StringComparison.Ordinal);
}
Опишите тип полки с названием. Положите полку "north" в словарь и проверьте, находится ли там новая полка с тем же названием. Результат выведите в консоль.