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

如何避免过多if语句,优化数值范围判断返回对应值的冗余代码

代码优化方案

你可以直接用「预定义区间映射+线性查找/二分查找」的方案,通用性最强,不管后续区间规则有没有变化都能直接适配,不需要修改逻辑,也能完全删掉所有if/else判断。

方案1:通用区间映射方案(推荐,无规律也能用)

先提前定义好所有区间和对应返回值的映射集合,然后遍历匹配即可,示例代码如下:

// 提前定义区间映射,只需要初始化一次,建议定义为静态只读字段
private static readonly (int Min, int Max, int Result)[] _rangeMap = new[]
{
    (1, 10, 56),
    (11, 24, 55),
    // 剩下的区间直接按格式补在这里就行,直到返回值为35的条目
};

public int GetResult(int number)
{
    foreach(var range in _rangeMap)
    {
        if(number >= range.Min && number <= range.Max)
        {
            return range.Result;
        }
    }
    // 这里加你的默认返回逻辑,比如抛异常或者返回默认值
    throw new ArgumentOutOfRangeException(nameof(number));
}

如果你的区间数量特别多(超过100个),还可以把区间按从小到大排好序之后用二分查找,性能会更高。

方案2:数学公式计算方案(性能最高,适合固定规律的场景)

如果你的区间和返回值有固定的数学规律,直接用公式计算就能一步得到结果,连遍历都不需要。
从你给出的前两个区间推导:

  • 1~10 返回56
  • 11~24 返回55
    可以算出每一段的上限分别是10、24,差值是14,返回值每次减1,你可以把所有区间的上限都列出来之后,直接计算number落在第几个区间,就能算出结果:
    比如如果后续区间的长度都是14的话,公式可以写成:
public int GetResult(int number)
{
    if(number < 1) throw new ArgumentOutOfRangeException(nameof(number));
    if(number <=10) return 56;
    // 11以上的区间长度都是14的情况
    var section = (number - 11) /14;
    var result = 55 - section;
    // 限制最小返回值为35
    return result >=35 ? result : throw new ArgumentOutOfRangeException(nameof(number));
}

如果区间长度不是固定的,你可以把所有区间的上限放到一个有序数组里,用Array.BinarySearch找下标,再用56 - 下标就能得到结果,性能也比遍历高。

注意:你原来的写法里用Enumerable.Range.Contains会每次生成一个新的区间序列再遍历,性能很差,优化之后完全避免了这个额外开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:24:07