Hallo,
in einer ConcurrentDictionary-Liste sollen HostInformationen abgelegt werden.
Standardmäßig werden im Key keine doppelte Werte zugelassen.
In diesem Falle handelt es sich beim Key um einen eigenen Typ "HostInfosKey". Damit "ConcurrentDictionary" doppelte Keys prüfen kann, müssen zwei Methoden vorhanden sein:
GetHashCode
Equals
Beide Methoden sind in der Klasse "HostInfosKey" vorhanden.
Im Beispiel werden auch für beide Variablen myKey1 und myKey2 identische HashWerte ausgegeben.
Dennoch werden immer in der Liste myHosts zwei Einträge mit identischem Key angelegt.
Im Beispiel werden beide Variablen myKey1 und myKey2 mit equals miteinander verglichen und als identisch ausgegeben.
Wenn zweimal der Befehl TryAdd mit der identischer Variable ausgeführt wird, wird in der Liste myHosts korrekterweise nur ein Eintrag angelegt:
Kann mir jemand erklären, warum das so ist?
Spoiler anzeigen
in einer ConcurrentDictionary-Liste sollen HostInformationen abgelegt werden.
Standardmäßig werden im Key keine doppelte Werte zugelassen.
In diesem Falle handelt es sich beim Key um einen eigenen Typ "HostInfosKey". Damit "ConcurrentDictionary" doppelte Keys prüfen kann, müssen zwei Methoden vorhanden sein:
GetHashCode
Equals
Quelle: stackoverflow.com/questions/27…-same-keys-more-than-once
Die Info steht in der Antwort auf die in der Webseite gestellte Frage.
Die Info steht in der Antwort auf die in der Webseite gestellte Frage.
Beide Methoden sind in der Klasse "HostInfosKey" vorhanden.
Im Beispiel werden auch für beide Variablen myKey1 und myKey2 identische HashWerte ausgegeben.
Dennoch werden immer in der Liste myHosts zwei Einträge mit identischem Key angelegt.
Im Beispiel werden beide Variablen myKey1 und myKey2 mit equals miteinander verglichen und als identisch ausgegeben.
Wenn zweimal der Befehl TryAdd mit der identischer Variable ausgeführt wird, wird in der Liste myHosts korrekterweise nur ein Eintrag angelegt:
Kann mir jemand erklären, warum das so ist?
VB.NET-Quellcode
- Module Module2
- Public Class HostInfosKey
- Enum HostProperty
- Hostname = 0
- PingReply = 1
- Ping = 2
- IPAddress = 3
- MacAddress = 4
- End Enum
- Public HostID As Double
- Public Name As HostProperty
- Overrides Function ToString() As String
- Return HostID.ToString & "/" & Name.ToString
- End Function
- ''' <summary>
- ''' Hash-Code bilden
- ''' </summary>
- ''' <returns>Integer-Wert</returns>
- Overrides Function GetHashCode() As Integer
- Dim myText = Me.ToString
- Dim myHash = myText.GetHashCode
- Console.WriteLine("String: {0}, Hash: {1}", myText, myHash)
- Return myHash
- End Function
- ''' <summary>
- ''' Vergleicht zwei HostInfosKey-Werte
- ''' </summary>
- ''' <param name="value">zu vergleichender HostInfosKey-Wert</param>
- ''' <returns></returns>
- Overloads Function Equals(value As HostInfosKey) As Boolean
- Return CBool(value.HostID = Me.HostID And value.Name = Me.Name)
- End Function
- End Class
- Public myHosts As New Concurrent.ConcurrentDictionary(Of HostInfosKey, Object)
- Sub Main()
- Dim myHosts As New Concurrent.ConcurrentDictionary(Of HostInfosKey, Object)
- Dim myKey1 = New HostInfosKey With {.HostID = 0, .Name = HostInfosKey.HostProperty.Hostname}
- Dim myKey2 = New HostInfosKey With {.HostID = 0, .Name = HostInfosKey.HostProperty.Hostname}
- Dim myHash1 = myKey1.GetHashCode
- Dim myHash2 = myKey2.GetHashCode
- If myKey1.Equals(myKey2) Then
- Console.WriteLine("identisch!")
- End If
- myHosts.TryAdd(key:=myKey1, value:="systemA")
- myHosts.TryAdd(key:=myKey2, value:="SystemB")
- Console.WriteLine("Anzahl Einträge in myHosts: {0}", myHosts.Count)
- Console.WriteLine("")
- Console.WriteLine("Auslesen aller Werte")
- Console.WriteLine("=========================")
- For Each myItem In myHosts
- Console.WriteLine("Eintrag: HostID: {0} / Property: {1} / Value: {2}", myItem.Key.HostID, myItem.Key.Name.ToString, myItem.Value)
- Next
- Console.WriteLine("Ende.. beliebige Taste betätigen")
- Console.ReadKey()
- End Sub
- End Module