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

C#窗体程序为何从列表中读取错误的公差数据?

C#窗体程序区间判断问题修复

问题根源

  1. 代码结构混乱:A类的后续区间判断脱离了rbA.Checked的条件范围,导致无论选中A/B类,这些判断都会执行并覆盖结果;同时B类代码被嵌套在Diameter>25.4的else块中,当数值>25.4时,B类的最后一个区间判断根本不会触发。
  2. 区间逻辑错误:所有区间判断误用||(逻辑或)而非&&(逻辑与),比如Diameter > 1.57 || Diameter == 6.35会让所有大于1.57的数值都匹配该条件,区间范围完全重叠。
  3. 缺少分支排他性:未使用else if结构,多个区间条件满足时,后续判断会覆盖前面的计算结果。

修复步骤

  1. 将A类所有区间判断嵌套在rbA.Checked && rbMetric.Checked的大条件中,确保只有选中A类时才执行。
  2. 将B类代码从else块中移出,改为独立的if(rbB.Checked && rbMetric.Checked)条件判断,避免受Diameter数值影响。
  3. 修正区间判断逻辑:将||改为&&,明确每个区间的范围(如1.57 < Diameter <=6.35),最后一个区间直接用Diameter>25.4。
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:52:02