2016-04-07 7 views
1

Ich habe diese Klasse:containsKey, wenn der Schlüssel ist ein Objekt

Public Class AdDimensionsToAdDetails 
    Public Sub New() 
    End Sub 

    Public Overrides Function equals(adDimensions As AdDimensions) As Boolean 
     If adDimensions Is Nothing Then 
      Return False 
     End If 

     Return Me.adDimensionsToAdDetails.Keys.First().width = adDimensions.width AndAlso 
      Me.adDimensionsToAdDetails.Keys.First().height = adDimensions.height 

    End Function 

    Public ReadOnly Property adDimensionsToAdDetails As Dictionary(Of AdDimensions, AdDetails) 
     Get 
      Return New Dictionary(Of AdDimensions, AdDetails) From { 
       {New AdDimensions(300, 250), New AdDetails(New MinMaxJobsCount(3, 3), True)}, 
       {New AdDimensions(300, 50), New AdDetails(New MinMaxJobsCount(1, 1), False)}, 
       {New AdDimensions(728, 90), New AdDetails(New MinMaxJobsCount(3, 3), True)}, 
       {New AdDimensions(160, 600), New AdDetails(New MinMaxJobsCount(3, 7), True)} 
      } 

     End Get 
    End Property 

End Class 

Ich möchte überprüfen, ob adDimensionsToAdDetails einen Schlüssel von 300.250 enthält.

So habe ich versucht:

dim adDimensions as new AdDimensions(300,250) 

' it contains the key 
if (AdDimensionsToAdDetails.adDimensionsToAdDetails.ContainsKey(adDimensions)) then 

End If 

ich gelesen, dass ich equals außer Kraft setzen müssen. So

Ich versuchte es, aber ich bekomme: function 'equals' cannot be declared 'overrides' because it does not override a function in a base class

Jede Hilfe dankbar!

Antwort

2

Die Klasse Dictionary ist als Hashtabelle implementiert. Beim Vergleich eines Schlüsselwerts ruft Dictionary die Methode GetHashCode für das fragliche Schlüsselelement auf, und nur wenn es einen Eintrag für diesen bestimmten Hashcode hat, ruft es dann die Equals-Methode des Elements auf, um die Gleichheit zu überprüfen.

daher die Dictionary(Of AdDimensions, AdDetails).ContainsKey Methode zu verwenden, werden Sie sowohl die Equals und GetHashCode Methoden der Klasse AdDimensions von System.Object erbt außer Kraft setzen müssen.

Das Folgende ist eine mögliche Implementierung, basierend auf Ihrem Code.

Class AdDimensions 
    Public Sub New(height As Int32, width As Int32) 
     Me.height = height 
     Me.width = width 
    End Sub 
    Public height As Int32 
    Public width As Int32 

    Public Overrides Function Equals(obj As Object) As Boolean 
     Dim other As AdDimensions = TryCast(obj, AdDimensions) 
     Dim ret As Boolean 
     If other IsNot Nothing Then 
      ret = (Me.width = other.width) AndAlso (Me.height = other.height) 
     End If 
     Return ret 
    End Function 

    Public Overrides Function GetHashCode() As Integer 
     Return Me.width Xor Me.height 
    End Function 
End Class 
+0

Es funktioniert, aber ich habe eine Frage .. Wie ich gelesen, zwei sind gleich Objekte garantiert gleich Hashcodes haben .. aber, weil es verschiedene Versionen von .NET Framework sind, können sie den gleichen Wert zurück für verschiedene Objekte. Dann brauchen wir die Gleichen? um es zu überprüfen? –

+1

Es hat nichts mit der Framework-Version zu tun. Zwei verschiedene Objekte desselben Typs können denselben Hash-Code ergeben. Wenn Sie nicht wissen, was Hashtabellen sind und wie sie funktionieren, recherchieren sie sie. Die Equals-Methode wertet die Parameter aus, die Sie für die Gleichbehandlung der Objekte festlegen sollen. Gleichheit bedeutet nicht dasselbe Objekt; nur dass sie gleiche definierende Eigenschaften haben. – TnTinMn

+0

Vielen Dank TnTinMn – RaSor

0

Sie können die Signatur einer Methode, die überschrieben werden soll, nicht ändern. Die Object.Equals Methode hat einen Parameter vom Typ Object. Ihre Überschreibung muss dasselbe haben.

Das sagte, ich habe gerade festgestellt, dass Sie diese Methode in der falschen Klasse haben. Es müsste in der Klasse AdDimensions sein, wenn zwei Instanzen dieses Typs miteinander verglichen werden sollen.