找到列表中与给定数字最接近的较小值和较大值的最佳方法是什么

本文关键字:是什么 方法 最佳 最接近 列表 数字 | 更新日期: 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();