Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpEqHs 104 of 509 menu
◀ ▶

Согласование порядка и хеш-кода в 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" в словарь и проверьте, находится ли там новая полка с тем же названием. Результат выведите в консоль.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить