我有一个键/值对的排序列表,并希望找到新键旁边的值

时间:2010-03-01 03:08:16

标签: 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)。我想要像二进制搜索这样的东西。

由于

2 个答案:

答案 0 :(得分:2)

是的,您希望完全二进制搜索 - 使用List<t>.BinarySearch方法,特别是重载IComparer第二个参数(并使用简单的辅助类实现该接口)只是比较键。)

答案 1 :(得分:2)

您可以使用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的按位补码。“

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