다음 코드는 큰 절차에서 발췌 한 것입니다 (주변 코드는 관련되지 않음). 아무도 내가 왜 반환 두 번째 ContainsKey 줄을 얻을 수없는 설명 할 수 있습니까? 힌트 : 루핑을 줄이기 위해 채워진 셀이 몇 개있는 워크 시트에서이 방법을 시도해보십시오.Vb.Net Excel 범위가 키로 포함 된 사전 사용
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
최종 클래스
개체가 사전에 대한 키로 사용됩니다
왜 'cell.Address'를 키로 사용하지 않으시겠습니까? –
팀, 귀하의 질문에 대한 답변, 그것은 삽입/행 제거가 내 열쇠를 망칠 것이기 때문입니다. 위의 답변으로 생각하는 것을 게시했습니다 (지금까지는 제대로 작동하는 것으로 보입니다). – OfficeAddinDev
@Ryan 자신 만의 솔루션이 마음에 들면 업데이트를 대답으로 이동하고 동의하십시오 –