C#窗体程序为何从列表中读取错误的公差数据?
C#窗体程序区间判断问题修复
问题根源
- 代码结构混乱:A类的后续区间判断脱离了
rbA.Checked的条件范围,导致无论选中A/B类,这些判断都会执行并覆盖结果;同时B类代码被嵌套在Diameter>25.4的else块中,当数值>25.4时,B类的最后一个区间判断根本不会触发。 - 区间逻辑错误:所有区间判断误用
||(逻辑或)而非&&(逻辑与),比如Diameter > 1.57 || Diameter == 6.35会让所有大于1.57的数值都匹配该条件,区间范围完全重叠。 - 缺少分支排他性:未使用
else if结构,多个区间条件满足时,后续判断会覆盖前面的计算结果。
修复步骤
- 将A类所有区间判断嵌套在
rbA.Checked && rbMetric.Checked的大条件中,确保只有选中A类时才执行。 - 将B类代码从
else块中移出,改为独立的if(rbB.Checked && rbMetric.Checked)条件判断,避免受Diameter数值影响。 - 修正区间判断逻辑:将
||改为&&,明确每个区间的范围(如1.57 < Diameter <=6.35),最后一个区间直接用Diameter>25.4。 - 使用
else if替代独立if,确保每个数值只匹配一个区间,避免结果被覆盖。
优化后的代码
namespace test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private List<double> ClassAPlus = new List<double> { 0.080, 0.130, 0.150, 0.200, 0.250, 0.250 }; private List<double> ClassAMinus = new List<double> { 0.030, 0.050, 0.080, 0.100, 0.100, 0.130 }; private List<double> ClassBPlus = new List<double> { 0.080, 0.250, 0.300, 0.400, 0.500, 0.500 }; private List<double> ClassBMinus = new List<double> { 0.030, 0.100, 0.100, 0.150, 0.150, 0.250 }; private void btnEnter_Click(object sender, EventArgs e) { double Diameter, Plus, Minus, Nominal, Tolerance; if (!double.TryParse(txtSize.Text, out Diameter)) return; // 解析失败直接返回,避免后续错误 // 处理A类逻辑 if (rbA.Checked && rbMetric.Checked) { if (Diameter <= 1.57) { UpdateLabels(Diameter, ClassAPlus[0], ClassAMinus[0]); } else if (Diameter > 1.57 && Diameter <= 6.35) { UpdateLabels(Diameter, ClassAPlus[1], ClassAMinus[1]); } else if (Diameter > 6.35 && Diameter <= 12.7) { UpdateLabels(Diameter, ClassAPlus[2], ClassAMinus[2]); } else if (Diameter > 12.7 && Diameter <= 19.05) { UpdateLabels(Diameter, ClassAPlus[3], ClassAMinus[3]); } else if (Diameter > 19.05 && Diameter <= 25.4) { UpdateLabels(Diameter, ClassAPlus[4], ClassAMinus[4]); } else if (Diameter > 25.4) { UpdateLabels(Diameter, ClassAPlus[5], ClassAMinus[5]); } } // 处理B类逻辑 else if (rbB.Checked && rbMetric.Checked) { if (Diameter <= 1.57) { UpdateLabels(Diameter, ClassBPlus[0], ClassBMinus[0]); } else if (Diameter > 1.57 && Diameter <= 6.35) { UpdateLabels(Diameter, ClassBPlus[1], ClassBMinus[1]); } else if (Diameter > 6.35 && Diameter <= 12.7) { UpdateLabels(Diameter, ClassBPlus[2], ClassBMinus[2]); } else if (Diameter > 12.7 && Diameter <= 19.05) { UpdateLabels(Diameter, ClassBPlus[3], ClassBMinus[3]); } else if (Diameter > 19.05 && Diameter <= 25.4) { UpdateLabels(Diameter, ClassBPlus[4], ClassBMinus[4]); } else if (Diameter > 25.4) { UpdateLabels(Diameter, ClassBPlus[5], ClassBMinus[5]); } } } // 提取重复代码为方法,减少冗余 private void UpdateLabels(double diameter, double plus, double minus) { double nominal = (diameter + plus + diameter - minus) / 2; double tolerance = plus - nominal; lblResult.Text = $"{nominal.ToString("0.000")} ±{tolerance.ToString("0.000")}"; lblBilat.Text = $"{diameter.ToString("0.000")} +{plus.ToString("0.000")} /- {minus.ToString("0.000")}"; lblRange.Text = $"{(nominal - tolerance).ToString("0.000")} - {(nominal + tolerance).ToString("0.000")}"; } } }
额外优化说明
- 提取重复的标签更新逻辑为
UpdateLabels方法,减少代码冗余,便于后续维护。 - 增加
double.TryParse的失败处理,避免解析失败时出现异常。
内容的提问来源于stack exchange,提问作者Learning
相关产品推荐
相关产品推荐

