Zum Inhalt springen

2 Hashwerte das gleiche Objekt? [VB.net]


Lsteinme

Empfohlene Beiträge

Hi, ich hab eben mal wieder ne Seltsamkeit gefunden,

ich hab mir eine Grafische Oberfläche aufgebaut in der man sämmtliche Mitarbeiter eines Projekts sehen kann.

Da es nicht möglich sein soll, 2mal die gleiche Mitarbeiter-Rolle-Projekt kombi in der Datenbank zu haben, hab ich vor dem Speichern eine Abfrage eingebaut, die durchtestet ob sich durch eine Änderung oder das hinzufügen eines Neuen Mitarbeiters zum Projekt eine Inkonsitenz ergeben hat.

das tut die Methode in dem sie für jede Row in dem Tabellayout der Groupboxen(für die Unterschiedlichen Rollenkategorien[Verwaltung,Produktion, etc]) ein Objekt folgender Klasse erstellt:

Public Class valueTrippel(Of typ1, typ2, typ3)

    Public val1 As typ1

    Public val2 As typ2

    Public val3 As typ3

    Public Overrides Function Equals(obj As Object) As Boolean

        If obj.GetType.Equals(Me.GetType) Then

            Dim castedobj As valueTrippel(Of typ1, typ2, typ3) = CType(obj, valueTrippel(Of typ1, typ2, typ3))

            'Same Class but different variableTypes

            If Not (castedobj.val1.GetType.Equals(val1.GetType) AndAlso castedobj.val2.GetType.Equals(val2.GetType) AndAlso castedobj.val3.GetType.Equals(val3.GetType)) Then

                Return False

            End If

            Dim vg1 As Boolean = castedobj.val1.Equals(Me.val1)

            Dim vg2 As Boolean = castedobj.val2.Equals(Me.val2)

            Dim vg3 As Boolean = castedobj.val3.Equals(Me.val3)

            If (vg1 AndAlso vg2 AndAlso vg3) Then

                Return True

            End If

        End If

        Return False

    End Function

    Public Overrides Function GetHashCode() As Integer

        Dim hc As Integer = (val1.ToString & val2.ToString & val3.ToString).GetHashCode

        Return hc

    End Function

End Class
Die Rows können hierbei entweder 3 Lables oder aber eine checkbox und 2 spezialComponenten enthalten, welche ähnlich einer Combobox ein SelectedItem haben. Der eigentliche Consistenzcheck erfolgt dann so:
 

Private Function SavePrecheck() As Boolean

        Dim trippellist As New Dictionary(Of valueTrippel(Of Projekt, Rollen_Typen, Mitarbeiter), Control())

        Dim successfull As Boolean = True

        Dim doubles As String = ""

        For Each kat As Rollen_Kategorien In ControlsDict.Keys

            For Each Cont As Control() In ControlsDict(kat).Values

                If Not (Cont(1).GetType.Equals(GetType(TeamComboBox))) Then

                    Continue For

                End If

                Dim trippel As New valueTrippel(Of Projekt, Rollen_Typen, Mitarbeiter) With {.val1 = project, .val2 = CType(CType(Cont(1), TeamComboBox).SelectedItem, Rollen_Typen), .val3 = CType(Cont(2), EmployeeButton).Employee}

                If Not trippellist.ContainsKey(trippel) Then

                    trippellist.Add(trippel, Cont)

                Else

                    successfull = False

                    doubles += trippel.val2.ToString & trippel.val3.ToString & vbNewLine

                End If

            Next

        Next

        If Not successfull Then

            MsgBox("Error: At least one Entry was more then ones in the View, the values were:" & vbNewLine & doubles & "please fix this inconsistence before saving", MsgBoxStyle.Critical, "Error")

        End If

        Return successfull

    End Function

Jetzt tauch hier aber ein komischer Hashwert fehler in der zeile

If Not trippellist.ContainsKey(trippel) Then

auf.

Ich bin hier mehrmals im Debuger durchgegangen, und zuerst geht die ContainsKey-Methode ja immer in getHashcode.

Hier jedoch kommt bei 2 Objekten bei denen die Variablen val1-val3 jeweils identisch sind unterschiedliche Hashwerte. Wie kann das sein?

Einmal bekomm ich: -1597763128 und einmal -590045485

Die ToString Methoden sind sauber überschieben, und liefern jeweils den Projektnamen, Rollennamen und Mitarbeiternamen zurück

Gruß Lucas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, das ist zwar keine vernünftige erklärung in meinen Augen, aber es kam vom Rollennamen. Nach dem ich hier hinter die .toString-methode ein Trim ran gehängt hab hat es funktioniert. Die rolle für dich ich den fehler bekommen hatte, hatte auch einen Whitespace in der Mitte, aber warum hat das den Hashcode beeinflust wenn ich ein Trim dahinter hänge? eigentlich sollte doch .toString, wenn ich es an den Namen der Rolle hänge, immer den gleichen Text liefern und da garnicht selbst dran rum pfuschen oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...