C# 我有一个键/值对的排序列表,希望找到与新键相邻的值
我有一个键/值对列表(可能会使用SortedList),我不会添加新值 相反,我将使用新的关键点来获得边界值。例如,如果我有以下键/值对: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
(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-但是我可以测试一下。谢谢