У меня есть собственный класс, который использует дженерики.
Мне нужно использовать этот класс в качестве ключа словаря, как показано в примере кода ниже:
Я могу использовать переопределенный метод Object.GetHashCode
, но я не уверен, как действовать дальше. Пожалуйста, помогите, спасибо.
Module Module2
Dim myStore As New Dictionary(Of Pair(Of Long, Integer), String)
Public Function ContainsItem(id As Long, code As Integer) As Boolean
Return myStore.ContainsKey(New Pair(Of Long, Integer)(id, code))
End Function
Public Class Pair(Of T1, T2)
Implements IEquatable(Of Pair(Of T1, T2))
Private v1 As T1
Private v2 As T2
Public Sub New(ByVal v1 As T1, ByVal v2 As T2)
Me.v1 = v1
Me.v2 = v2
End Sub
Public Function first() As T1
Return v1
End Function
Public Function second() As T2
Return v2
End Function
Public Overrides Function GetHashCode() As Integer
'i hit this break point, but ...
'how do i compute an integer hashcode from a long and an Integer?
Return MyBase.GetHashCode()
End Function
Public Overrides Function Equals(obj As Object) As Boolean
Return MyBase.Equals(obj)
End Function
Public Function Equals1(other As Pair(Of T1, T2)) As Boolean Implements IEquatable(Of Pair(Of T1, T2)).Equals
'just as a test, but the code never gets here.
Return True
End Function
End Class
Public Sub TestCase()
Dim a = New Pair(Of Long, Integer)(10, 10)
myStore.Add(a, "Item 1")
Dim b = ContainsItem(10, 10)
'b is always false
End Sub
End Module
ContainsKey
терпит неудачу? какую комбинацию не видит? - person Ňɏssa Pøngjǣrdenlarp   schedule 13.01.2015a = New Pair(Long, Int32)(5,5)
является ключом в словаре, NET должен сообщать об истине с помощьюmyDict.ContainsKey(a)
. вам не нужно ничего делать. ОДНАКО, если вы создадите новыйPair(T, TT)
и попытаетесь найти его, он потерпит неудачу даже с теми же значениями, потому что НОВЫЙ объект имеет другой хэш-код даже с теми же значениями. Это вариант использования? - person Ňɏssa Pøngjǣrdenlarp   schedule 13.01.2015IEqualityComparer(Of Pair(Of Long, Of Integer))
, а неIComparer(...)
. - person Jon Skeet   schedule 13.01.2015IEqualityComparer
соответствующим образом (и передадите это словарю при построении) или реализуетеIEquatable
в самом ключевом классе. - person Jon Skeet   schedule 13.01.2015IEquatable
в ключевом классе, похоже, это должно решить эту проблему. я разместил фактический код в редактировании выше - person Charles Okwuagwu   schedule 13.01.2015IEquatable
. Если вы это сделали, опубликуйте короткий, но полный пример, демонстрирующий проблему. - person Jon Skeet   schedule 13.01.2015ContainsKey
, я не могу придумать, как это обойти - person Charles Okwuagwu   schedule 13.01.2015GetHashCode
, что вы должны делать всякий раз, когда реализуетеIEquatable<T>
. Из документации: если вы реализуетеIEquatable<T>
, вы также должны переопределить реализации базового классаObject.Equals(Object)
иGetHashCode
, чтобы их поведение соответствовало поведению методаIEquatable<T>.Equals
. - person Jon Skeet   schedule 13.01.2015Equals(object)
,Equals(T)
иGetHashCode
, это будет работать. - person Jon Skeet   schedule 13.01.2015GetHashCode
должным образом, во-первых, и вы до сих пор не создали короткую, но полную программу, демонстрирующую проблему... - person Jon Skeet   schedule 13.01.2015