字典访问:复合键vs连接字符串索引

时间:2012-01-31 15:28:07

标签: vb.net hash dictionary hashtable composite-key

我想要使用字符串(AcctNum)和日期(BalDate)的组合键来访问字典。

在我看来,最简单的方法是通过简单地将日期转换为字符串并连接来创建密钥:

MyKey = BalDate.ToString & "|" & AcctNum

我知道我也可以通过编写单独的类并覆盖GetHashCode()Equals() la this solution来创建复合键。

对我来说,连接字符串是一个更简单的,如果不那么优雅的解决方案。我错过了一些令人信服的理由,为什么我应该采用复合键类方法?

这个查找是我正在进行的项目的关键,因此性能是我的主要目标(可读性紧随其后)。

3 个答案:

答案 0 :(得分:2)

如果性能对您来说最重要,那么使用单独的对象可能是更好的解决方案:每次准备查找键时,您都会将日期格式化为字符串。此外,如果您决定向键添加更多部分,则更容易扩展多部分键:忽略连接的缺失元素比构造函数的缺失参数更容易。

答案 1 :(得分:2)

使用元组作为词典的键。

MyKey = Tuple.Create(BalDate, AcctNum)

元组比连接字符串更简单,更不容易出错。 它比使用单独的类更好,因为您不需要自己重写GetHashCode()和Equals()。

答案 2 :(得分:1)

您还可以通过继承Dictionary(Of TKey, TValue)

来创建专门的集合
Public Class BalanceDict
    Inherits Dictionary(Of String, Balance)

    Public Shadows Sub Add(ByVal bal As Balance)
        MyBase.Add(bal.BalDate & "|" & bal.AcctNum, bal)
    End Sub

    Public Shadows Function TryGetValue(ByVal balDate As Date, ByVal acctNum As String, <OutAttribute()> ByRef bal As Balance) As Boolean
        Return MyBase.TryGetValue(balDate & "|" & acctNum, bal)
    End Function
End Class

我不认为复合键和连接字符串之间的速度差异很大。使用复合键,您不必将日期转换为字符串;但是,您必须计算不同的哈希码并将它们组合在一起。但是,通过使用字典的专门实现,您可以隐藏这些实现细节,并随时决定更改生成密钥的方式,而不会影响程序的其他部分。