C# 我有一个键/值对的排序列表,希望找到与新键相邻的值

C# 我有一个键/值对的排序列表,希望找到与新键相邻的值,c#,generics,collections,sortedlist,sorteddictionary,C#,Generics,Collections,Sortedlist,Sorteddictionary,我有一个键/值对列表(可能会使用SortedList),我不会添加新值 相反,我将使用新的关键点来获得边界值。例如,如果我有以下键/值对: (0,100) (6, 200), (9, 150), (15, 100), (20, 300) 我有一个新的键7,我希望它返回200和150,因为7在6和9之间 如果我给15,我希望它返回100和100(因为15正好是15)。我想要类似于二进制搜索的东西 谢谢是的,您想要准确地进行二进制搜索——使用List.BinarySearch方法,特别是使用IC

我有一个键/值对列表(可能会使用SortedList),我不会添加新值

相反,我将使用新的关键点来获得边界值。例如,如果我有以下键/值对:

(0,100) (6, 200), (9, 150), (15, 100), (20, 300) 
我有一个新的键7,我希望它返回200和150,因为7在6和9之间

如果我给15,我希望它返回100和100(因为15正好是15)。我想要类似于二进制搜索的东西


谢谢

是的,您想要准确地进行二进制搜索——使用
List.BinarySearch
方法,特别是使用
IComparer
第二个参数的重载(并用一个只比较键的简单辅助类实现该接口)。

您可以使用
List.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]]);
var-keys=新列表(sortedList.keys);
int index=keys.BinarySearch(目标);
int较低;
int-upper;
如果(索引>=0){
下限=上限=指数;
}
否则{
索引=~index;
上限=索引{1},{2}”,
目标,分类列表[键[下]],分类列表[键[上]];
您必须使用
List.BinarySearch
的返回值来获取边界值。从中,其返回值为:

如果找到项,则排序的
列表中项的从零开始的索引;否则,为负数,是大于项的下一个元素索引的位补码;如果没有较大的元素,则为计数的位补码


此外,对于低于第一个或超过最后一个的元素,此代码分别“返回”第一个和最后两次。这可能不是您想要的,但由您定义边界条件。另一个问题是如果集合是空的,我没有解决这个问题。

如果您有以下搜索条件,您希望得到什么样的输出(用“return”的话):(-10,50)。。。或者(25400)?这看起来像我想要的,我回家后会试试。我想知道你是不是想用a+而不是a-但是我可以测试一下。谢谢