Vb.Net使用Excel范围字典作为键

下面的代码摘自一个更大的过程(周围的代码是不相关的)。 任何人都可以解释为什么我无法获得第二个ContainsKey行返回True? 提示:在工作表上试试这个只有几个填充的单元格来减less循环。

For Each ws As Excel.Worksheet In Wb.Worksheets Dim dic As New Dictionary(Of Excel.Range, String) rngUsed = ws.UsedRange For Each cell As Excel.Range In rngUsed dic.Add(cell, "test") 'THE FOLLOWING TWO MESSAGES SHOULD DISPLAY THE SAME RESULT, BUT DO NOT. WHY??? MsgBox(dic.ContainsKey(cell)) 'Returns True MsgBox(dic.ContainsKey(ws.Range(cell.Address))) 'Returns False Next Next 

更新:我已经添加了下面的代码,它似乎工作:

 Dim dic As New Dictionary(Of Excel.Range, String)(New MyComparer()) 'replaces line from above Class MyComparer Implements IEqualityComparer(Of Excel.Range) Public Function Equals1(ByVal x As Excel.Range, ByVal y As Excel.Range) As Boolean Implements System.Collections.Generic.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 Function GetHashCode1(ByVal obj As Excel.Range) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Excel.Range).GetHashCode Return obj.Count.GetHashCode End Function 

末class

当一个对象被用作字典的键时,.Net使用GetHashCode来生成在底层散列表中使用的键。 既然你使用了两个不同的对象,你会得到不同的值。

有关更多详细信息,请参阅MSDN文档 。

更好的方法是将范围转换为string表示forms并将其用作关键字。

 Dim dic As New Dictionary(Of Excel.Range, String)(New MyComparer()) 'replaces line from above Class MyComparer Implements IEqualityComparer(Of Excel.Range) Public Function Equals1(ByVal x As Excel.Range, ByVal y As Excel.Range) As Boolean Implements System.Collections.Generic.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 Function GetHashCode1(ByVal obj As Excel.Range) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Excel.Range).GetHashCode Return obj.Count.GetHashCode End Function 

这是解决scheme。 请注意,在这个自定义比较器中使用的GetHashCode非常缓慢,所以如果有人有一个想法来加快这一点,我很乐意听到它。 @competent_tech,我必须使用对象的键,因为没有string表示的范围是唯一的,不会改变(例如,如何添加/删除行时地址改变)。