代码之家  ›  专栏  ›  技术社区  ›  vulkanino

创建可比较的字典键

  •  4
  • vulkanino  · 技术社区  · 15 年前

    我想使用字典(键,值),键不是基类型,而是一个类,如:

    Public Class MyKey
    
        Sub New(ByVal packet As String, ByVal sent As Boolean)
            Me.packet = packet.ToUpper.Trim
            Me.sent = sent
        End Sub
    
        Private packet As String
        Private sent As Boolean
    End Class
    

    Public Class MyKey
        Implements System.IEquatable(Of MyKey)
    
    
        Sub New(ByVal packet As String, ByVal sent As Boolean)
            Me.packet = packet.ToUpper.Trim
            Me.sent = sent
        End Sub
    
        Public Overloads Function Equals(ByVal other As MyKey) As Boolean Implements IEquatable(Of MyKey).Equals
            Return other.sent = Me.sent AndAlso other.packet = Me.packet
        End Function
    
    
        Private packet As String
        Private sent As Boolean
    End Class
    

    但要取得一致的结果,我还必须实施对象。等于以及Object.GetHashCode:

    Public Class MyKey
        Implements System.IEquatable(Of MyKey)
    
    
        Sub New(ByVal packet As String, ByVal sent As Boolean)
            Me.packet = packet.ToUpper.Trim
            Me.sent = sent
        End Sub
    
        Public Overloads Function Equals(ByVal other As ChiavePietanza) As Boolean Implements IEquatable(Of MyKey).Equals
            Return other.sent = Me.sent AndAlso other.packet = Me.packet
        End Function
    
        Overrides Function Equals(ByVal o As Object) As Boolean
            Dim cast As MyKey = DirectCast(o, MyKey)
            Return Equals(cast)
        End Function
    
        Public Overrides Function GetHashCode() As Integer
            Return packet.GetHashCode Or sent.GetHashCode
        End Function
    
    
        Private packet As String
        Private sent As Boolean
    End Class
    

    问题是:GetHashCode实现正确吗?我应该如何实现它,返回一个将字符串和布尔哈希码合并的哈希码?

    4 回复  |  直到 15 年前
        1
  •  4
  •   JaredPar    15 年前

    GetHashCode函数是正确的,并且符合哈希代码实现的已知规则。特别地

    • MyKey
    • 美奇钥匙

    packet sent ReadOnly 领域。现在暗示他们是 只读 因为它们在GetHashCode函数中使用。然而,未来的开发人员可能会忽略这一点,改变值并破坏GetHashCode所需的契约。明确地拥有它们 只读

    另一个小音符。虽然这是个好主意 IEquatable(Of T) Dictionary Equals GetHashCode 方法,以便在 字典

        2
  •  2
  •   Hans Passant    15 年前

    它是okayish,但是Or操作符不能生成分布良好的散列值,因为它只能打开位,而不能关闭位。改用Xor运算符。

        3
  •  2
  •   Community Mohan Dere    9 年前

    GetHashCode 覆盖来自:

    SO - What is the best algorithm for an overridden System.Object.GetHashCode? 所以你可以这样做:

    public override int GetHashCode() {
        int hash = 17;
        hash = (hash * 23) + ((packet != null) ? packet.GetHashCode() : 0);
        hash = (hash * 23) + ((sent != null) ? sent.GetHashCode() : 0);
        return hash;
    }
    

    它应该直接移植到VB。

        4
  •  0
  •   supercat    15 年前