我有一个自定义对象需要为表格键入。我需要生成一个唯一的数字键。我遇到了冲突问题,想知道是否可以利用字典来帮助我。
假设我有这样一个对象:
class Thingy
{
public string Foo;
public string Bar;
public string Others;
}
还有更多的字段。假设Foo和Bar是我的关键字段-如果它们在两个Thingy之间相等,则应将这两个对象视为相等(一个可能表示对另一个对象的更新,其他字段正在更新)。 所以我有这些:
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拥有相同的哈希码。
我的问题是:我能否使用Dictionary<Thingy, int
>,把我的Thingys放进去,然后使用从字典中出来的连续值作为我的实际键? 我想知道,当Dictionary检测到罕见的哈希码冲突时,它是否会调用Equals方法,确定对象实际上是不同的,并以不同方式存储它们。那么查找时,它将看到该哈希的桶并搜索正确的Thingy,再次使用Equals进行比较。
这种情况是否适用于字典,或者它只解决哈希码不同但(hash%size)相同的冲突?如果这样行不通,还有什么其他解决方法吗?
Object.Equals()
和==
运算符的情况。http://msdn.microsoft.com/en-us/library/ms173147%28VS.80%29.aspx - LBushkin