我有List<KeyValuePair<double, double>>
,列表按KeyValuePair.Key
排序,因此可以修改为二进制搜索。我有一个double
对象。现在,我的任务是找到double
对象的索引。以下是适用的条件:
double
对象与指定容差范围内的KeyValuePair.Key
匹配,则应返回相应的KeyValuePair.Value
。double
对象超出KeyValuePair.Key
的最大和最小范围,则应返回0。double
对象属于KeyValuePair.Key
的最大分钟数,但未达到指定容差范围内的任何KeyValuePair.Key
,则得到最近的上限和最接近KeyValuePair.Value
(以KeyValuePair.Key
衡量)。我知道C#中提供了二进制搜索实现,但它并不完全适合我的需求。我想问一下那里是否有满足我需求的实施方案?我不想花几个小时编写和调试其他人已经编写,调试和完善的代码。
答案 0 :(得分:7)
使用比较器和围绕List<T>.BinarySearch
的小包装器
static double Search(List<KeyValuePair<double, double>> list, double key) {
int index = list.BinarySearch(
new KeyValuePair<double, double>(key, 0),
new Comparer());
// Case 1
if (index >= 0)
return list[index].Value;
// NOTE: if the search fails, List<T>.BinarySearch returns the
// bitwise complement of the insertion index that would be used
// to keep the list sorted.
index = ~index;
// Case 2
if (index == 0 || index == list.Count)
return 0;
// Case 3
return (list[index - 1].Value + list[index].Value) / 2;
}
class Comparer : IComparer<KeyValuePair<double, double>> {
public int Compare(
KeyValuePair<double, double> x,
KeyValuePair<double, double> y)
{
if (Math.abs(x.Key - y.Key) < TOLERANCE)
return 0;
return x.Key.CompareTo(y.Key);
}
}