找到列表中与给定数字最接近的较小值和较大值的最佳方法是什么
本文关键字:是什么 方法 最佳 最接近 列表 数字 | 更新日期: 2023-09-27 18:00:07
我有一个随机的数字列表,比如1,8,13,20,25,32,50,55,64,70现在给定一个数字,比如35,所需的较小值将是32,较大值将是50。
我尝试的方法是迭代的所有值
var value = 35;
var list = new List<int> { 1, 8, 13, 20, 25, 32, 50, 55, 64, 70 };
var lesser = list.First();
var greater = list.Last();
foreach (var curr in list)
{
if (curr >= value)
{
greater = curr;
break;
}
lesser = curr;
}
Console.WriteLine("Lesser Value :{0}'tGreater Value:{1}", lesser, greater);
现在我问这个问题的原因是,我需要针对一次生成列表,然后多次请求值的情况进行优化。为每个请求重复列表似乎是个坏主意。
更新
这个问题没有具体说明如果我们得到一个精确匹配,需要什么,我需要上界和下界是匹配的元素,即,在上面的列表中,32应该返回32作为较小的值,32作为较大的值。
反映相同情况的修改答案是:
int value = 32;
int[] list = new[] { 1, 8, 13, 20, 25, 32, 50, 55, 64, 70 };
int? floor = null;
int? ceil = null;
int index = Array.BinarySearch(list, value);
if (index >= 0) // element is found
{
floor = ceil =list[index] ;
}
else
{
index = ~index;
if (index == list.Length)
{
ceil = floor = list[index-1];
}
else
{
ceil = list[index];
floor = list[((index==0)?index: index-1)];
}
}
Console.WriteLine("floor = {0}", floor);
Console.WriteLine("ceil = {0}", ceil);
int value = 35;
int[] list = new[] { 1, 8, 13, 20, 25, 32, 50, 55, 64, 70 };
int? floor = null;
int? ceil = null;
int index = Array.BinarySearch(list, value);
if (index >= 0) // element is found
{
if (index > 0)
floor = list[index - 1];
if (index < list.Length - 1)
ceil = list[index + 1];
}
else
{
index = ~index;
if (index < list.Length)
ceil = list[index];
if (index > 0)
floor = list[index - 1];
}
Console.WriteLine("floor = {0}", floor);
Console.WriteLine("ceil = {0}", ceil);
如果列表被排序,您可以这样做:
int value = 35;
var lessThan = list.TakeWhile(p => p < value).LastOrDefault();
var greaterThan = list.SkipWhile(p => p <= value).FirstOrDefault();