I have dictionary containing key value pairs.
SortedDictionary<int,int> dictionary=new SortedDictionary<int,int>();
dictionary.Add(1,33);
dictionary.Add(2,20);
dictionary.Add(4,35);
I want to get previous key value pair from a known key value. In the above case, if I have key 4, then how can I get <2,20>?
It’s hard to implement this efficiently with a
SortedDictionary<TKey, TValue>since it is implemented as a binary search tree that does not expose predecessors or successors.You could of course just enumerate each KeyValuePair until you find the “known” key. With a little bit of LINQ, this would look like (assuming the key definitely exists and isn’t the first key):
If those assumptions don’t hold, you could do:
(Check that
maybePreviousKvp != nullto ascertain that the previous KeyValuePair was retrieved successfully.)But this isn’t going to be efficient at all.
If feasible, consider using a
SortedList<TKey, TValue>instead (obviously, this may not be possible if you can’t take its slower inserts and deletes). This collection supports efficient key and value-retrieval by ordered index since it is implemented as a growable array. Then your query becomes as simple as:IndexOfKeyruns a binary search on the keys-list, running inO(log n)time. Everything else should run in constant time, meaning the entire operation should run in logarithmic time.Otherwise, you’ll have to implement yourself / find a BST collection that does expose predecessors / successors.