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 的 的东西,因为它很少使用,这意味着许多开发人员不会熟悉它,从而阻碍代码的可读性。
我是初学者,我想问一下如何让这段代码更简单更短 感谢大家的回复
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 的