2012-01-02 2 views
1

다음 코드는 큰 절차에서 발췌 한 것입니다 (주변 코드는 관련되지 않음). 아무도 내가 왜 반환 두 번째 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 

최종 클래스

개체가 사전에 대한 키로 사용됩니다
+0

왜 'cell.Address'를 키로 사용하지 않으시겠습니까? –

+0

팀, 귀하의 질문에 대한 답변, 그것은 삽입/행 제거가 내 열쇠를 망칠 것이기 때문입니다. 위의 답변으로 생각하는 것을 게시했습니다 (지금까지는 제대로 작동하는 것으로 보입니다). – OfficeAddinDev

+0

@Ryan 자신 만의 솔루션이 마음에 들면 업데이트를 대답으로 이동하고 동의하십시오 –

답변

1
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 

이것은 해결책입니다. 이 커스텀 비교 자에서 사용되는 GetHashCode는 매우 느리다는 것을 알아두기 바랍니다. 누군가 속도를 높이려는 생각이 들었다면, 듣고 싶습니다. @competent_tech, 고유 한 범위의 문자열 표현이 없기 때문에 (예 : 행을 추가/삭제할 때 주소가 변경되는 방식과 같이) 변경 대상이 아닌 문자열 표현이 없으므로 키에 대한 개체를 사용해야합니다.

1

, 닷넷 사용 GetHashCode - 기본이되는 해시 테이블에서 사용되는 키를 생성합니다. 두 개의 서로 다른 객체를 사용하기 때문에 다른 값을 갖게됩니다.

자세한 내용은 the MSDN documentation을 참조하십시오.

더 나은 방법은 범위를 문자열 표현으로 바꾸고이를 키로 사용하는 것입니다.

관련 문제