C#中能否单行修改数组多个元素以简化批量布尔值赋值逻辑?
方案说明
把零散布尔变量替换为数组存储是合理的,且完全支持单行完成全部布尔值的修改,无需在每个点击方法中写7行赋值代码,优化后代码维护成本更低,扩展新类型也更方便。
具体实现步骤
- 先定义数据类型枚举替代数字索引,避免硬编码写错索引值:
enum DataType { Byte, Short, Int, Long, Float, Double, Decimal }
- 类中定义数组存储选中状态,无需单独声明7个布尔变量:
private readonly bool[] _typeSelected = new bool[Enum.GetValues(typeof(DataType)).Length];
- 所有类型选择按钮共用同一个点击事件,无需写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(); }
- 优化
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
相关产品推荐
相关产品推荐

