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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:24:24