我想要使用字符串(AcctNum
)和日期(BalDate
)的组合键来访问字典。
在我看来,最简单的方法是通过简单地将日期转换为字符串并连接来创建密钥:
MyKey = BalDate.ToString & "|" & AcctNum
我知道我也可以通过编写单独的类并覆盖GetHashCode()
和Equals()
la this solution来创建复合键。
对我来说,连接字符串是一个更简单的,如果不那么优雅的解决方案。我错过了一些令人信服的理由,为什么我应该采用复合键类方法?
这个查找是我正在进行的项目的关键,因此性能是我的主要目标(可读性紧随其后)。
答案 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
我不认为复合键和连接字符串之间的速度差异很大。使用复合键,您不必将日期转换为字符串;但是,您必须计算不同的哈希码并将它们组合在一起。但是,通过使用字典的专门实现,您可以隐藏这些实现细节,并随时决定更改生成密钥的方式,而不会影响程序的其他部分。