簡體   English   中英

重載 VB.NET 中的 Equals / GetHashCode 以使用對象作為字典鍵

[英]Overload Equals / GetHashCode in VB.NET to Use Objects as Dictionary Keys

我有一個字典,它的鍵是 Excel Range 對象(不,這是不可協商的),定義如下(CellProp 類型是一個 object,它包含各種單元格屬性):

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 屬性的 hash 代碼似乎有效(盡管速度很慢)?

您可能想稍微研究一下 hash 代碼的工作原理 Hash 代碼是 100% 任意的,可由程序員定義。 唯一重要的是,如果兩個實例不相同,那么它們的 hash 代碼應該不同 如果您有一個集合,其中幾乎所有 hash 代碼都相同(即計數 = 1),那么您的字典仍然可以正常工作,但它會退化為線性搜索,效率非常低。 這是因為幾乎所有實例都產生了 hash 次沖突,因此散列到桶中沒有任何好處。

例如,您可以嘗試的另一種 hash 代碼算法是從單元格的名稱生成一個代碼算法,它應該有更少的 hash 沖突:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM