【问题标题】:Dictionary access: composite key vs concatenated string index字典访问:复合键与连接字符串索引
【发布时间】:2012-02-23 07:48:27
【问题描述】:

我有一本字典,我想使用一个字符串 (AcctNum) 和日期 (BalDate) 的组合键来访问它。

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

MyKey = BalDate.ToString & "|" & AcctNum

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

对我来说,连接字符串是一种更简单但不那么优雅的解决方案。我是否缺少一些令人信服的理由,为什么我应该使用复合键类方法?

这个查找是我正在处理的项目的关键,所以性能是我的主要目标(可读性紧随其后)。

【问题讨论】:

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


    【解决方案1】:

    使用元组作为字典的键。

    MyKey = Tuple.Create(BalDate, AcctNum)
    

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

    【讨论】:

      【解决方案2】:

      你也可以通过继承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
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2022-01-07
          • 1970-01-01
          • 2019-12-21
          • 2023-04-03
          • 1970-01-01
          • 2019-05-28
          • 1970-01-01
          • 2013-07-10
          • 2018-08-23
          相关资源
          最近更新 更多