Since SortedDictionary
is sorted on the key, you can create a sorted list of keys with
var keys = new List<DateTime>(dictionary.Keys);
and then efficiently perform binary search on it:
var index = keys.BinarySearch(key);
As the documentation says, if index
is positive or zero then the key exists; if it is negative, then ~index
is the index where key
would be found at if it existed. Therefore the index of the "immediately smaller" existing key is ~index - 1
. Make sure you handle correctly the edge case where key
is smaller than any of the existing keys and ~index - 1 == -1
.
Of course the above approach really only makes sense if keys
is built up once and then queried repeatedly; since it involves iterating over the whole sequence of keys and doing a binary search on top of that there's no point in trying this if you are only going to search once. In that case even naive iteration would be better.
Update
As digEmAll correctly points out, you could also switch to SortedList<DateTime, decimal>
so that the Keys
collection implements IList<T>
(which SortedDictionary.Keys does not). That interface provides enough functionality to perform a binary search on it manually, so you could take e.g. this code and make it an extension method on IList<T>
.
You should also keep in mind that SortedList
performs worse than SortedDictionary
during construction if the items are not inserted in already-sorted order, although in this particular case it is highly likely that dates are inserted in chronological (sorted) order which would be perfect.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…