2013-11-01 36 views
2

我在使用Visual basic Integer()作爲字典的關鍵時遇到了麻煩。我遇到了一個問題,即使我將ContainsKey()數組的值與現有密鑰值相同,它也會返回false。我認爲這可能是因爲ContainKey()檢查內存中的對象是否相同,而不是相同。正確?我有以下的代碼結構:你可以使用整數數組作爲唯一的字典鍵嗎?

Dim RGB(3) As Integer 
Dim dic as Dictonary(Of Integer(), Double()) 

... 
... 

If dic.ContainsKey(RGB) Then 'This never returns true 
      meritValue = (MerirtLookUpAVG(RGB)(0) * MerirtLookUpAVG(RGB)(1) + meritValue)/MerirtLookUpAVG(RGB)(0) + 1 
     MerirtLookUpAVG(RGB)(0) += 1 
     MerirtLookUpAVG(RGB)(1) = meritValue 
Else 
    MeirtLookUpAVG.Add(RGB, {1, meritValue} 
EndIf 
+0

你有沒有考慮過使用'System.Drawing.Color'來存儲數據而不是整數數組?所有你需要做的就是使用['Color.FromArgb('](http://msdn.microsoft.com/en-us/library/cce5h557%28v=vs.110%29.aspx?cs-save-lang = 1&cs-lang = vb)並傳入你的3個值 –

+0

是的,但是我不能在這部分代碼中,因爲我將它們發送給一些數組函數。 –

+2

可變對象不應該用作鍵入詞典 –

回答

5

您可能需要使用該接受密鑰類型的自定義IEqualityComparer(Of T)constructor for Dictionary

沒有自定義IEqualityComparer(Of T)的數組不是有效的對象類型作爲字典(或其他基於散列的集合)的鍵。

+0

您能否詳細介紹一下IEqualityComparer(Of T)的使用。我正在創建一個實現接口的自定義類,並且每個被調用時都有Equals1(...)作爲Boolen和GetHasCode(...)作爲Integer()。 –

+0

@AlexanderVanAtta基本上就是這樣 - 你需要一個自定義的類,它能夠正確地實現Equals和GetHashCode,以便你希望數組比較的工作方式。請記住,任何兩個是Equal的對象也必須提供相同的哈希代碼... –

+0

@AlexanderVanAtta問題是沒有單個數組的「equals」定義 - 如果兩個數組包含相同的數字號碼?訂單是否重要?等等... –

相關問題