У меня проблема с пользовательским объектом, который необходимо указать для таблицы. Мне нужно сгенерировать уникальный числовой ключ. У меня проблемы со столкновениями, и мне интересно, могу ли я использовать словарь, чтобы помочь мне. Предположим, у меня есть такой объект:
class Thingy
{
public string Foo;
public string Bar;
public string Others;
}
и т. Д. С дополнительными полями. Допустим, Foo и Bar являются моими ключевыми полями - если они равны между двумя Thingys, тогда два объекта следует считать равными (один может представлять собой обновление другого, при этом обновляются поля Others). Итак, у меня есть эти:
public override bool Equals(object obj)
{
Thingy thing = (Thingy)obj; // yes I do type check first
return (this.Foo == thing.Foo && this.Bar == thing.Bar);
}
public override int GetHashCode()
{
return (this.Foo + this.Bar).GetHashCode(); // using default string impl
}
так что это работает по большей части, но есть редкие случаи, когда два Thingys, которые на самом деле разные, имеют одинаковый хэш-код.
У меня такой вопрос: могу ли я использовать словарь <Thingy, int
>, где я помещаю свои слова Thingys, и использовать последовательное значение, выходящее из словаря, в качестве моего фактического ключа? Мне интересно, вызовет ли Словарь при обнаружении редкой коллизии хеш-кода мой метод Equals, определит, что объекты на самом деле разные, и сохранит их по-разному. Затем я визуализировал, когда смотрел его, он увидел бы корзину для этого хэша и нашел правильный Thingy, снова используя Equals для сравнения.
Это относится к словарю, или он разрешает конфликты только в тех случаях, когда хеш-код отличается, но (размер хеш-кода) одинаков? Если это не сработает, что может?