Это трудно эффективно реализовать это с SortedDictionary<TKey, TValue>
, поскольку она реализуется в виде двоичного дерева поиска, не разоблачить предшественников или преемников.
Вы можете, конечно, просто перечислить каждый KeyValuePair, пока не найдете «известный» ключ. С немного LINQ, это будет выглядеть (предполагая, что ключ определенно существует, и не первый ключ):
SortedDictionary<int, int> dictionary = ...
int knownKey = ...
var previousKvp = dictionary.TakeWhile(kvp => kvp.Key != knownKey)
.Last();
Если эти предположения не выполняются, вы могли бы сделать:
var maybePreviousKvp = dictionary.TakeWhile(kvp => kvp.Key != knownKey)
.Cast<KeyValuePair<int, int>?>()
.LastOrDefault();
(Убедитесь, что maybePreviousKvp != null
чтобы убедиться, что предыдущий KeyValuePair был получен успешно.)
Но это не будет эффективным на всех.
Если это возможно, рассмотреть вопрос об использовании SortedList<TKey, TValue>
вместо (очевидно, это не может быть возможным, если вы не можете взять его более медленные вставки и удаления). Эта коллекция поддерживает эффективный поиск ключей и значений на , заказанный индекс, поскольку он реализован как растущий массив. Тогда ваш запрос становится столь же просто, как:
SortedList<int, int> dictionary = ...
int knownKey = ...
int indexOfPrevious = dictionary.IndexOfKey(knownKey) - 1;
// if "known" key exists and isn't the first key
if(indexOfPrevious >= 0)
{
// Wrap these in a KeyValuePair if necessary
int previousKey = dictionary.Keys[indexOfPrevious];
int previousValue = dictionary.Values[indexOfPrevious];
}
запускает бинарный поиск по клавишам-списка, работает в O(log n)
времени. Все остальное должно работать в постоянное время, то есть вся операция должна выполняться в логарифмическом времени.
В противном случае вам придется реализовать себя/найти коллекцию BST, которая будет показывать предшественников/преемников.
SortedDictionary словаре = новый SortedDictionary (); –
PramodChoudhari
Смею спросить: «Почему?» –
Я думаю, что ответы на [этот вопрос] (http://stackoverflow.com/questions/931891/sorted-dictionary-in-c) объясняют, как делать то, что вы хотите. –