Имеется следующий код:
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() и когда в этом нет потребности?
Если упростить, то хеш-таблица работает так:
GetHashCode()
для ключаEquals()
. То, что хеш-коды совпали, еще не значит, что Equals()
вернет true
duplicates[key2] = "Hello2";
на этой строчке совпал хеш-код, но хеш-таблица должна проверить, равен ли ключ уже существующему в таблице, поэтому вызывается Equals()
На практике берется GetHashCode() % table_length
, где table_length
размер внутренней таблицы.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Изображение было снято на камеру, далее было перевернутоПри загрузке в PictureBox изображение отображается не перевернутым (то есть точно так...
Проект webApiСоздал новый контроллер и хотел подключить пространство имен Web
Есть прямоугольная матрица, состоящая из 0 и 1Необходимо посчитать конъюнкцию строк это матрицы (каждую с каждой), а затем сумму полученной...