Вы можете сделать это с помощью List<T>.BinarySearch
:
var keys = new List<int>(sortedList.Keys);
int index = keys.BinarySearch(target);
int lower;
int upper;
if (index >= 0) {
lower = upper = index;
}
else {
index = ~index;
upper = index < keys.Count ? index : index - 1;
lower = index == 0 ? index : index - 1;
}
Console.WriteLine("{0} => {1}, {2}",
target, sortedList[keys[lower]], sortedList[keys[upper]]);
Вы должны использовать возвращаемое значение List<T>.BinarySearch
, чтобы добраться до граничных значений. Начиная с msdn , его возвращаемое значение:
"Начинающийся с нуля индекс элемента в отсортированном List<T>
, если элемент найден; в противном случае - отрицательное число, которое является побитовым дополнением индекса следующего элемента, который больше элемента или, если нет большего элемента, побитовое дополнение Count. "
Кроме того, для элементов, которые попадают ниже первого или после последнего, этот код «возвращает» первое и последнее дважды соответственно. Это может быть не то, что вы хотите, но это зависит от вас, чтобы определить свои граничные условия. Еще один случай, если коллекция пуста, к которой я не обращался.