2012-04-09 2 views
1

다음과 같이 정의 된 Excel 범위 개체 (아니요, 협상 가능하지 않음) 인 키가있는 사전이 있습니다 (CellProp 형식은 다양한 셀을 포함하는 개체입니다) 속성) :VB.NET에서 오버로드 같음/GetHashCode를 사용하여 사전 키로 개체 사용

Dim dic As New Dictionary(Of Excel.Range, CellProp)(New RangeComparer()) 

키가 개체이기 때문에 Equals/GetHashCode 함수를 오버로드해야합니다. 현재 구현은 다음과 같습니다.

그러나 사전에 여러 셀 (예 : 수백)을 한꺼번에 추가하면 실행 속도가 매우 느려질 수 있습니다. 가장 중요한 것은이를 수행하는 더 빠른 방법이 있습니까? 2 차적으로 Range의 Count 속성에 대한 해시 코드를 가져 오는 것이 왜 (천천히) 작동하는 것일까 요?

답변

3

how hash codes work에 대한 약간의 연구가 필요할 수 있습니다. 해시 코드는 100 % 임의이며 프로그래머가 정의 할 수 있습니다. 중요한 것은 두 인스턴스가 같지 않으면 해시 코드가 달라야합니다.. 거의 모든 해시 코드가 동일한 (즉, count = 1) 콜렉션이있는 경우 사전은 여전히 ​​정상적으로 작동하지만 선형 검색으로 저하되며 이는 매우 비효율적입니다. 이는 거의 모든 인스턴스가 해시 충돌을 생성하기 때문에 버킷에 대한 해시가 제공하는 이점이 없기 때문입니다. 예를 들어

, 당신은 훨씬 적은 해시 충돌이 있어야 세포의 이름, 하나를 생성하는 시도 할 수 다른 해시 코드 알고리즘 :

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 
+0

감사합니다. 그 두 번째 질문을 해결합니다. 난 그 속도가 같음 함수를 오버로드에서 오는 것 같아요. 그 속도를 높이는 방법에 대한 아이디어가 있습니까? "Return x Is y"와 같은 무언가가 효과가있을 것이라고 생각했을 지 모르지만 그렇지 않습니다. – OfficeAddinDev

+2

더 나은'GetHashCode' 알고리즘을 사용하면'Equals' 메쏘드는 해쉬 콜리 전의 경우에만'Equals'가 필요하기 때문에 훨씬 덜 자주 호출되어야합니다. 사실,'x.Address (External : = True)'가 매우 느린 연산이라면 모든 범위에 대해 미리 계산할 수있는 방법을 찾고 싶을 것입니다. – mellamokb

+0

@Ryan :이 솔루션을 사용하면 주소 식별로 범위 ID를 정의하므로 코드에서 동등하게 'Dictionary (Of String, CellProp)'를 사용할 수 있습니다. 여기서 dic.Add (range : Address : True), cellProp)'dic.Add (range, cellProp)'가 아니라. 나는 사전의 유형이 협상 적이 아님을 알지만, 그래도 그럼에도 불구하고 지적 할만한 가치가 있다고 생각합니다. – phoog