GetHashCode() и Equals() в Hashtable

177
14 марта 2018, 03:41

Имеется следующий код:

public class Fish
    {
        private readonly string name;
        public Fish(string name)
        {
            this.name = name;
        }
        public override int GetHashCode()
        {
            return name.GetHashCode();
        }
        public override bool Equals(object obj)
        {
            var otherFish = obj as Fish;
            if (otherFish == null)
            {
                return false;
            }
        return otherFish.name == name;
    }
}
class Program
    {
        static void Main()
        {
            var duplicates = new Hashtable();
            var key1 = new Fish("Herring");
            var key2 = new Fish("Herring");
            var key3 = new Fish("Herring2");
            duplicates[key1] = "Hello";
            duplicates[key2] = "Hello2";
            duplicates[key3] = "Hello3";
            Console.WriteLine(duplicates.Count);
            // Delay.
            Console.ReadKey();
        }
    }

При вызове строк duplicates[key1] = "Hello" и duplicates[key3] = "Hello3" вызывается только метод GetHashCode(), а при вызове duplicates[key2] = "Hello3", вызывается метод Equals(). Как компилятор определил когда нужно вызывать метод Equals() и когда в этом нет потребности?

Answer 1

Если упростить, то хеш-таблица работает так:

  • Вызывается GetHashCode() для ключа
  • Если есть совпадения с хеш-кодом, который уже находится в таблице, вызывается метод Equals(). То, что хеш-коды совпали, еще не значит, что Equals() вернет true
  • Если объекты равны, то перезаписывается запись в таблице, если не равны, будет добавлена новая

duplicates[key2] = "Hello2"; на этой строчке совпал хеш-код, но хеш-таблица должна проверить, равен ли ключ уже существующему в таблице, поэтому вызывается Equals()

На практике берется GetHashCode() % table_length, где table_length размер внутренней таблицы.

READ ALSO
Написание текста в чат игры [требует правки]

Написание текста в чат игры [требует правки]

Тема такая: Нужно в игровой чат написать сообщение

208
Загружается перевернутое изображение C#

Загружается перевернутое изображение C#

Изображение было снято на камеру, далее было перевернутоПри загрузке в PictureBox изображение отображается не перевернутым (то есть точно так...

241
Can not resolve symbol Rider C#

Can not resolve symbol Rider C#

Проект webApiСоздал новый контроллер и хотел подключить пространство имен Web

206
Конъюнкция строк матрицы

Конъюнкция строк матрицы

Есть прямоугольная матрица, состоящая из 0 и 1Необходимо посчитать конъюнкцию строк это матрицы (каждую с каждой), а затем сумму полученной...

258