1

次のように定義された Excel Range オブジェクト (いいえ、これは交渉できません) をキーとする Dictionary があります (CellProp 型は、さまざまなセル プロパティを含むオブジェクトです)。

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

ただし、多数のセル (つまり、数百) を Dictionary に一度に追加すると、実行がかなり遅くなる可能性があります。最も重要なのは、これを行うためのより速い方法はありますか? 次に、Range の Count プロパティのハッシュ コードの取得が (ゆっくりではありますが) 機能しているように見えるのはなぜですか?

4

1 に答える 1

3

ハッシュ コードの仕組みについて少し調べてみるとよいでしょう。ハッシュ コードは 100% 任意であり、プログラマーが定義できます。重要なのは、2 つのインスタンスが同じでない場合、それらのハッシュ コードは異なる必要があるということだけです。ほぼすべてのハッシュ コードが同じ (つまり、count = 1) のコレクションがある場合、辞書は問題なく機能しますが、線形検索に劣化し、非常に非効率的です。これは、ほとんどすべてのインスタンスがハッシュ衝突を生成しているためであり、バケットへのハッシュによって提供される利点はありません。

たとえば、試すことができる別のハッシュ コード アルゴリズムは、セルの名前から 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
于 2012-04-09T14:54:14.843 に答える