Доступ к словарю: составной ключ или составной индекс строки - PullRequest
4 голосов
/ 31 января 2012

У меня есть словарь, к которому я хочу получить доступ с ключом, который является комбинацией строки (AcctNum) и даты (BalDate).

Мне кажется, что самый простой подход - создать ключ, просто преобразовав дату в строку и объединив:

MyKey = BalDate.ToString & "|" & AcctNum

Я знаю, что у меня также есть возможность создания составного ключа путем написания отдельного класса и переопределения GetHashCode() и Equals() а-ля этого решения .

Для меня каскадная строка является более простым, хотя и несколько менее элегантным решением. Я скучаю по какой-то убедительной причине, почему я должен пойти с подходом класса составного ключа?

Этот поиск - суть проекта, над которым я работаю, поэтому моя цель - производительность (с удобочитаемостью около секунды).

Ответы [ 3 ]

2 голосов
/ 16 октября 2012

Используйте кортеж в качестве ключа для вашего словаря.

MyKey = Tuple.Create(BalDate, AcctNum)

Кортежи проще и менее подвержены ошибкам, чем конкатенация строк. Это лучше, чем использование отдельного класса, поскольку вам не нужно переопределять GetHashCode () и Equals () самостоятельно.

2 голосов
/ 31 января 2012

Если производительность наиболее важна для вас, то, вероятно, лучшим решением будет использование отдельного объекта: вы сэкономите на форматировании даты в виде строки каждый раз, когда готовите ключ поиска. Кроме того, наличие многокомпонентного ключа проще расширить, если вы решите добавить к нему больше частей: гораздо проще пропустить отсутствующий элемент конкатенации, чем отсутствующий параметр конструктора.

1 голос
/ 31 января 2012

Вы также можете создать специализированную коллекцию, наследуя от 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

Я не думаю, что разница в скорости между составным ключом и объединенной строкой является существенной. С составным ключом вам не нужно конвертировать дату в строку; однако вам придется рассчитывать разные хеш-коды и комбинировать их. Однако, используя специализированную реализацию словаря, вы можете скрыть эти детали реализации и в любое время принять решение изменить способ генерации ключей, не затрагивая другие части вашей программы.

...