1

我有一个字典,其键是 Excel Range 对象(不,这是不可协商的),定义如下(CellProp 类型是一个包含各种单元格属性的对象):

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

但是,当一次将许多单元格(即数百个)添加到字典时,执行起来可能会很慢。最重要的是,有没有更快的方法来做到这一点?其次,为什么获取 Range 的 Count 属性的哈希码似乎有效(尽管速度很慢)?

4

1 回答 1

3

您可能想对哈希码的工作原理进行一些研究。哈希码是 100% 任意的,可由程序员定义。唯一重要的是,如果两个实例不相同,那么它们的哈希码应该不同。如果您有一个几乎所有哈希码都相同的集合(即count = 1),那么您的字典仍然可以正常工作,但它会退化为线性搜索,这是非常低效的。这是因为几乎所有的实例都在产生散列冲突,因此散列到桶中没有任何好处。

例如,您可以尝试的另一种哈希码算法是从单元格的名称生成一个,它应该有更少的哈希冲突:

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
于 2012-04-09T14:54:14.843 回答