[英]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.