在VB.NET中重载Equals / GetHashCode以使用对象作为字典键

我有一个字典的关键是Excel范围对象(不,这是不可协商的),定义如下(typesCellProp是一个对象,其中包含各种单元格属性):

Dim dic As New Dictionary(Of Excel.Range, CellProp)(New RangeComparer()) 

因为键是对象,我需要重载Equals / GetHashCode函数。 我目前的实施情况如下:

 Class RangeComparer Implements IEqualityComparer(Of Excel.Range) Public Overloads Function Equals(ByVal x As Excel.Range, ByVal y As Excel.Range) As Boolean Implements IEqualityComparer(Of Excel.Range).Equals If x.Address(External:=True) = y.Address(External:=True) Then Return True Else Return False End If End Function Public Overloads Function GetHashCode(ByVal obj As Excel.Range) As Integer Implements IEqualityComparer(Of Excel.Range).GetHashCode Return obj.Count.GetHashCode End Function End Class 

但是,一次添加多个单元格(即数百个)到Dictionary时,执行起来可能会很慢。 最重要的是,有没有更快的方法来做到这一点? 其次,为什么得到范围计数属性的哈希代码似乎工作(虽然缓慢)?

您可能想要对哈希码如何工作做一点研究。 哈希代码是100%任意的,可由程序员定义。 唯一重要的是,如果两个实例不一样,那么它们的哈希码应该是不同的 。 如果你有一个集合几乎所有的哈希码是相同的(即计数= 1),那么你的字典仍然工作得很好,但它降级到线性search,这是非常低效的。 这是因为几乎所有的实例都会产生散列冲突,所以散列到散列表没有任何好处。

例如,你可以尝试的另一个散列码algorithm是从单元格的名字中产生一个散列码algorithm,它应该有很less的散列冲突:

 Public Overloads Function GetHashCode(ByVal obj As Excel.Range) _ As Integer Implements IEqualityComparer(Of Excel.Range).GetHashCode Return obj.Address(External:=True).GetHashCode End Function