You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#:目标数不在列表时,查找其邻近上下数值

解决方法:查找目标数的上下邻近值

没问题,我来帮你实现这个查找逻辑。咱们先明确需求:当目标数不在double类型的列表中时,需要找出比目标数大的最小数值(下一个最高值)和比目标数小的最大数值(下一个最低值)。如果目标数在列表里,你可以根据需求选择返回目标本身作为上下值,或者做其他处理。

方法一:遍历法(简单直观)

这种方法适合列表规模不大的场景,逻辑清晰易懂:

double target = 5;
List<double> list = new List<double>() { 1, 2, 3, 7, 8, 9 };

// 如果原列表是无序的,先排序(升序)
list.Sort();

double? lower = null;
double? higher = null;

foreach (var num in list)
{
    if (num < target)
    {
        // 每次更新为比target小的更大值
        lower = num;
    }
    else if (num > target)
    {
        // 升序列表中第一个比target大的就是最小的那个,找到后直接跳出循环
        higher = num;
        break;
    }
    else
    {
        // 目标数在列表中的情况,这里返回自身作为上下值
        lower = num;
        higher = num;
        break;
    }
}

// 输出结果:double higher = 7; double lower = 3;
Console.WriteLine($"double higher = {higher}; double lower = {lower};");

方法二:二分查找法(高效优化)

如果你的列表规模很大,用二分查找能把时间复杂度从O(N)降到O(logN),性能提升明显:

double target = 5;
List<double> list = new List<double>() { 1, 2, 3, 7, 8, 9 };

// 确保列表是升序排序的
list.Sort();

int searchResult = list.BinarySearch(target);
double? lower = null;
double? higher = null;

if (searchResult >= 0)
{
    // 目标数存在于列表中
    lower = list[searchResult];
    higher = list[searchResult];
}
else
{
    // BinarySearch返回负数时,~searchResult得到第一个比target大的元素的插入位置
    int insertionPoint = ~searchResult;
    
    // 插入点大于0,说明存在比target小的元素
    if (insertionPoint > 0)
    {
        lower = list[insertionPoint - 1];
    }
    // 插入点小于列表长度,说明存在比target大的元素
    if (insertionPoint < list.Count)
    {
        higher = list[insertionPoint];
    }
}

// 输出结果:double higher = 7; double lower = 3;
Console.WriteLine($"double higher = {higher}; double lower = {lower};");

边界情况处理

别忘了考虑这些特殊场景:

  • 目标数比列表中所有元素都小:lower为null,higher是列表第一个元素
  • 目标数比列表中所有元素都大:higher为null,lower是列表最后一个元素
  • 列表为空:lower和higher都为null,建议添加判断抛出异常或返回默认值

内容的提问来源于stack exchange,提问作者Stavros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:44:40