2012-01-31 90 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()。