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

C#中能否单行修改数组多个元素以简化批量布尔值赋值逻辑?

方案说明

把零散布尔变量替换为数组存储是合理的,且完全支持单行完成全部布尔值的修改,无需在每个点击方法中写7行赋值代码,优化后代码维护成本更低,扩展新类型也更方便。

具体实现步骤

  1. 先定义数据类型枚举替代数字索引,避免硬编码写错索引值:
enum DataType
{
    Byte,
    Short,
    Int,
    Long,
    Float,
    Double,
    Decimal
}
  1. 类中定义数组存储选中状态,无需单独声明7个布尔变量:
private readonly bool[] _typeSelected = new bool[Enum.GetValues(typeof(DataType)).Length];
  1. 所有类型选择按钮共用同一个点击事件,无需写7个独立的Click方法:
    • 先在窗体设计器中把每个btn_****按钮的Tag属性设置为对应DataType枚举值,比如btn_Byte的Tag设为DataType.Byte
    • 所有按钮的点击事件都绑定下面的方法,单行即可完成全部布尔值的修改:
private void DataTypeBtn_Click(object sender, EventArgs e)
{
    // 单行完成所有值修改:先全量设为false,再把当前点击的对应类型设为true
    Array.Fill(_typeSelected, false); _typeSelected[(int)((Control)sender).Tag] = true;
}

如果使用的C#版本不支持Array.Fill(低于.NET Core 3.0/.NET 5),可以换用LINQ实现单行赋值:

private void DataTypeBtn_Click(object sender, EventArgs e)
{
    _typeSelected = _typeSelected.Select((_, idx) => idx == (int)((Control)sender).Tag).ToArray();
}
  1. 优化PostProcess方法,无需写大量独立if判断,可直接按索引匹配逻辑:
public void PostProcess(decimal left, decimal right, decimal answer, string oP)
{
    try
    {
        string outputStr = string.Empty;
        if (_typeSelected[(int)DataType.Byte])
        {
            byte byteLeft = Decimal.ToByte(left);
            byte byteRight = Decimal.ToByte(right);
            byte byteAnswer = Decimal.ToByte(answer);
            outputStr = $"{byteLeft}{oP}{byteRight} = {byteAnswer}";
        }
        // 其余类型的判断逻辑以此类推
        if (!string.IsNullOrEmpty(outputStr))
        {
            lbl_Output.Text = outputStr;
        }
    }
    catch (OverflowException)
    { 
        Error(2); 
        Error(0); 
    }
}

额外优势

后续如果需要新增支持的类型,只需要在DataType枚举中加新项,数组长度会自动适配,不需要新增布尔变量、不需要新增点击事件,只需要在PostProcess中加对应类型的处理逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:15:04