C# 如何使这段代码更简单和更短

C# How to make this code easier and shorter

我是初学者,我想问一下如何让这段代码更简单更短 感谢大家的回复

public static bool SelectedSingleAcc(SpecialForms.AccountManager am)
{
    //checkbox1
    if (am.selectedCB1.Checked == true 
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox2
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == true  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox3
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == true  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox4
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == true  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox5
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == true  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox6
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == true  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox7
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == true  
        && am.selectedCB8.Checked == false) return true;
    //checkbox8
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == true) return true;
            
    return false;
}
// get all values into an array for easier handling:
values = new[] 
{
    am.selectedCB1.Checked,
    am.selectedCB2.Checked,
    am.selectedCB3.Checked,
    am.selectedCB4.Checked,
    am.selectedCB5.Checked,
    am.selectedCB6.Checked,
    am.selectedCB7.Checked,
    am.selectedCB8.Checked,
};

// find out if exactly one is true
return values.Count(val => val == true) == 1;

也就是说...正确的 UI 决定是使用单选按钮而不是复选框。他们已经为您实现了这个逻辑。每当你发现自己编号你的变量时,你应该认真思考为什么这应该是一个数组而不是许多单个变量。

public static bool SelectedSingleAcc(SpecialForms.AccountManager am)
        {
            int checkedNumbers = 0;
            if (am.selectedCB1.Checked) checkedNumbers++;
            if (am.selectedCB2.Checked) checkedNumbers++;
            if (am.selectedCB3.Checked) checkedNumbers++;
            if (am.selectedCB4.Checked) checkedNumbers++;
            if (am.selectedCB5.Checked) checkedNumbers++;
            if (am.selectedCB6.Checked) checkedNumbers++;
            if (am.selectedCB7.Checked) checkedNumbers++;
            if (am.selectedCB9.Checked) checkedNumbers++;
            
            if (checkedNumbers == 1) //only one checkbox selected, we think the result is true
                 return true;
            
            return false;
            
        }

因此看起来您正在检查最多选中一个复选框 n return true,否则 return false

因为,为了甚至出现在窗体上,控件必须添加到控件集合中,我们可以搜索它(使用 LINQ)以查找符合条件的控件。在这种情况下,我们将查看所有复选框的控件,并计算名称以“selectedCB”开头且状态已选中的控件。我们将计数与 1 进行比较,如果只有 1 则结果为真,如果有 0 或 2+ 则结果为假:

return p.Controls
  .OfType<Checkbox>()
  .Count(c => c.Name.StartsWith("selectedCB") && c.Checked) == 1;
  • p 是包含复选框的 panel/group 框的名称。

  • 如果它们直接在表单上使用 this(或表单变量的名称,如果此代码不是包含框的表单的一部分)。

  • 如果 panel/on 表单中没有其他复选框,您可以删除 c.Name.StartsWith...。名称检查纯粹是为了停止,例如您的 isActiveCheckbox 被选中,因此也污染了计数

  • 如果还有其他复选框的名称也以“selectedCB”开头,最简单的方法是重命名它们,以便只有这 8 个复选框的名称以“selectedCB”开头,或者将他们在自己的面板中,但如果您想要更精致的逻辑,请添加评论,例如坚持名称为 selectedCB[1-8]

    的正则表达式

看起来您正在实施的规则是 8 个复选框的 then 状态之间的异或条件。

在这种情况下,使用 C# 的 XOR 运算符 ^ 可能会产生最短解决方案的竞争者,例如

public static bool SelectedSingleAcc(SpecialForms.AccountManager am)
{
    return am.selectedCB1.Checked   
           ^ am.selectedCB2.Checked
           ^ am.selectedCB3.Checked
           ^ am.selectedCB4.Checked
           ^ am.selectedCB5.Checked  
           ^ am.selectedCB6.Checked
           ^ am.selectedCB7.Checked
           ^ am.selectedCB8.Checked;
}

话虽如此,我建议不要使用 XOR ^ 运算符,并考虑类似于 nvoigt 的 的东西,因为它很少使用,这意味着许多开发人员不会熟悉它,从而阻碍代码的可读性。