Lsteinme Geschrieben 17. Mai 2013 Teilen Geschrieben 17. Mai 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 17. Mai 2013 Autor Teilen Geschrieben 17. Mai 2013 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.