if/else阶梯结构中的多条件else子句能否简化写法?
问题
我现有如下else子句:
else if (iItemIndex == 1 || iItemIndex == 3 || iItemIndex== 5 || iItemIndex == 7 || iItemIndex == 10 || iItemIndex == 12 || iItemIndex == 14 || iItemIndex == 16 || iItemIndex == 19 || iItemIndex == 21 || iItemIndex == 23 || iItemIndex == 25)
这段判断逻辑是否可以简化?当前代码可正常运行、无逻辑错误,仅咨询是否存在更精简的写法实现该条件校验,上述else子句所处的完整代码上下文如下:
if(iItemIndex == 0 || iItemIndex == 9 || iItemIndex == 18) { // Do something } else if (iItemIndex == 1 || iItemIndex == 3 || iItemIndex== 5 || iItemIndex == 7 || iItemIndex == 10 || iItemIndex == 12 || iItemIndex == 14 || iItemIndex == 16 || iItemIndex == 19 || iItemIndex == 21 || iItemIndex == 23 || iItemIndex == 25) { // Do something else } else { // Do something else }
回答
可以简化,常见的简化方案有三种,根据实际场景选择即可:
1. 利用数值规律简化(效率最高、代码最精简)
给出的判断值存在明确的数学规律:
- 第一个分支的
0、9、18均为9的倍数,满足iItemIndex % 9 == 0 - 第二个分支的所有值对9取模的结果为
1、3、5、7,均为奇数;第一个分支的9的倍数对9取模结果为0(偶数),不会和第二个分支冲突 - 剩余else分支的值对9取模结果为
2、4、6、8,均为非0偶数
简化后的代码如下:
if (iItemIndex % 9 == 0) { // 原0、9、18分支逻辑 } else if (iItemIndex % 9 & 1) // 等价于(iItemIndex %9) %2 ==1,位运算效率更高 { // 原长串||判断的分支逻辑 } else { // 原剩余分支逻辑 }
这个写法完全匹配原有判断逻辑,没有任何功能偏差,甚至可以支持超出25的索引按同规则自动适配。
2. 位掩码匹配(易维护、效率高)
如果不想硬找规律,且索引最大值不超过31(当前场景最大为25,完全满足),可以用32位整数做位掩码,把需要匹配的索引对应的位设为1即可:
// 预计算匹配掩码,后续增删匹配值只需要修改这里的位定义 const uint32_t second_branch_mask = (1U<<1) | (1U<<3) | (1U<<5) | (1U<<7) | (1U<<10) | (1U<<12) | (1U<<14) | (1U<<16) | (1U<<19) | (1U<<21) | (1U<<23) | (1U<<25); if (iItemIndex %9 ==0) // 第一个分支也可以用同样的掩码方式定义 { // Do something } else if (iItemIndex <= 25 && (second_branch_mask & (1U << iItemIndex))) { // Do something else } else { // Do something else }
这种写法判断效率和原生==判断一致,后续调整匹配值时不需要写长串或与逻辑,维护成本更低。
3. 集合包含判断(可读性最高)
如果使用C#/Java/Python等高级语言,可以直接用内置的集合容器存匹配值,用Contains方法判断,代码可读性最好:
// C#示例 var firstBranchSet = new HashSet<int>{0,9,18}; var secondBranchSet = new HashSet<int>{1,3,5,7,10,12,14,16,19,21,23,25}; if (firstBranchSet.Contains(iItemIndex)) { // Do something } else if (secondBranchSet.Contains(iItemIndex)) { // Do something else } else { // Do something else }
选择建议
- 如果判断规则长期固定不会调整,优先选第一种数学规律写法,最精简高效
- 如果后续可能频繁增删匹配的索引值,选第二种或第三种写法,可维护性更强
- 不要为了过度精简牺牲代码可读性,如果团队成员对取模逻辑不熟悉,保留原生的长串
==判断也完全没问题,可读性反而更高。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

