2012-01-31 136 views
4

我有一本字典,我想用字符串(AcctNum)和日期(BalDate)的组合键来访问字典。字典访问:组合键vs串联字符串索引

在我看来,最简单的方法是通过简单的日期转换为字符串并连接到打造关键:

MyKey = BalDate.ToString & "|" & AcctNum 

我知道我也有创造一个复合键的选项,通过写一个单独的并覆盖GetHashCode()Equals() a la this solution

对我来说,串联的字符串是一个简单的,如果少了几分优雅,解决方案。我错过了一些令人信服的理由,为什么我应该使用组合键类方法?

这个查找我的工作项目的关键,因此性能是我的主要目标(与可读性紧密秒)。

回答

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 

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

2

如果性能是你最重要的,然后使用一个单独的对象很可能是一个更好的解决方案:你会节省你正在准备一个查找键,每次格式化日期字符串。此外,如果您决定向关键字添加更多部分,则拥有多部分关键字更容易扩展:与构造函数的缺少参数相比,忽略缺少的连接元素要容易得多。

1

使用元组作为你的字典键。

MyKey = Tuple.Create(BalDate, AcctNum) 

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