如何避免过多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
相关产品推荐
相关产品推荐

