2012-01-02 15 views
1

次のコードは、より大きな手順から抜粋したものです(周囲のコードは関係ありません)。誰も私が2番目のContainsKey行がTrueを返すことができない理由を説明することはできますか?ヒント:ループを減らすために、少数の入力セルがあるワークシートでこれを試してみてください。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 

UPDATE:私は、次のコードを追加して、それが動作しているようだ:

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は、基になるハッシュテーブルで使用されるキーを生成します。 2つの異なるオブジェクトを使用しているので、異なる値が得られます。

詳細はthe MSDN documentationを参照してください。

より良いアプローチは、範囲を文字列表現に変えてキーとして使用することです。

関連する問題