Получить "ближайший" ключ в словаре Visual Basic - PullRequest
2 голосов
/ 29 сентября 2011

В Visual Basic у меня есть словарь, который содержит дату в качестве ключа и пользовательский класс в качестве значения (я буду использовать строку в примере). Я отслеживаю список, в котором дата сохраняется со значением. Например, допустим, у меня есть словарь со следующими значениями:

Dim dict As Dictionary(Of Date, String)
    dict.Add(DateTime.Now, "test one") // Suppose the time of this date is 12:03:10
    dict.Add(DateTime.Now, "test two") // Suppose the time of this date is 13:07:20
    dict.Add(DateTime.Now, "test three") // Suppose the time of this date is 14:15:30
    dict.Add(DateTime.Now, "test four") // Suppose the time of this date is 15:19:40

Теперь система выдает мне дату, которая не имеет значения, но нуждается в дате, аналогичной первой предыдущей дате. Допустим, я получаю дату со временем 14:00:00, мне понадобится значение «test two», потому что 13:07:20 - это первый ключ ниже 14:00:00 (ключ, который на самом деле недоступен в словарные ключи).

Если предположить, что список может быть очень большим, есть ли способ / как лучше найти ключ, который я ищу?

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

(Не удалось опубликовать свой вопрос в течение 8 часов ...)

Используя мой словарь и используя dict.Keys я сделал:

Dim lookupDate As Date = Date.Parse("01/01/2008 12:17:39")

Dim query = dict.Keys.AsQueryable().Where(Function(singleKey) singleKey < lookupDate)
Dim result As String = query.Last().ToString()

Это решение должно иметь лучшую производительностьиз-за iQueryable, если я правильно.

1 голос
/ 29 сентября 2011

Метод Keys даст вам массив, содержащий все ключи.

Dim k As Variant
k = dict.Keys

Затем вы можете просмотреть этот массив, чтобы найти ключ, который удовлетворяет критерию.Вот пример, не полностью проверенный ...

Dim myDate As Variant
Dim myKey As Variant
myDate = 1234 ' or whatever your target date is
Dim i As Long
myKey = k(0)
For i = 1 To UBound(k)
    If k(i) < myDate And k(i) > myKey Then
        myKey = k(i)
    End If
Next i

myKey теперь должен содержать ключ, который удовлетворяет вашему критерию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...