C# 更有效地排序枚举数组
目前,我的Winform上有一些按钮需要在不同点禁用/启用,具体取决于用户单击的内容 我写的第一稿是C# 更有效地排序枚举数组,c#,enums,performance,C#,Enums,Performance,目前,我的Winform上有一些按钮需要在不同点禁用/启用,具体取决于用户单击的内容 我写的第一稿是 button1.Enabled = false; button2.Enabled = false; 禁用2个按钮,这显然是一个可怕的方法,因为目前有很多超过2个,可能更多,因为这仍在开发中。因此,我需要有一种方法来轻松地更改表单上的按钮选择 然后我想到了这个 private enum Buttons { Button1, Button2 } // etc with all buttons -
button1.Enabled = false;
button2.Enabled = false;
禁用2个按钮,这显然是一个可怕的方法,因为目前有很多超过2个,可能更多,因为这仍在开发中。因此,我需要有一种方法来轻松地更改表单上的按钮选择
然后我想到了这个
private enum Buttons { Button1, Button2 } // etc with all buttons - that are named :)
private void DisableButtons(params Buttons[] buttons)
{
foreach (Buttons button in buttons)
{
switch (button)
{
case Buttons.Button1:
button1.Enabled = false;
break;
case Buttons.Button2:
button2.Enabled = false;
break;
}
}
}
我还是不太满意。我可以把开关箱报废,然后用它修理
对于每个按钮,我只是认为一定有更好的方法
有没有关于如何更有效地完成这项工作的想法
谢谢您可以将最后一行代码缩短为:
button1.Enabled = !buttons.Contains(Buttons.Button1);
替代解决方案
也可以使用每个按钮的属性为每个按钮设置枚举值
button1.Tag = Buttons.Button1;
button2.Tag = Buttons.Button2;
button3.Tag = Buttons.Button3;
// etc
您可以对for循环中的所有按钮执行此操作:
var buttons = <all buttons, todo>
foreach (var button in buttons) {
button.Enabled = !button.Contains((Buttons)button.Tag));
}
我建议您实际上不希望创建一个灵活启用和禁用任何按钮组合的函数,因为您还没有意识到表单将如何工作。当然,这可能会为您节省几行代码,但不会将任何上下文信息传递给下一个维护代码的开发人员。它的运行速度也不会比直接设置控件的状态快 我将创建一个函数,它在窗体改变状态时被调用,它将获取与窗体状态相关的所有可能参数。然后,我将解码这些参数,并使用传统开关和if语句,在一次传递中按名称显式设置窗体上控件的状态
这个中心功能将向您和未来的开发人员清楚地说明表单的状态如何变化以及控件的预期行为。它不会以不必要的抽象级别降低代码的性能。您能重复一下第一个代码片段中明显可怕的地方吗?@Jodrell说我有10个或更多按钮,我想每个人都会同意,对每个按钮执行buttonx.Enabled=false不是一个好方法。您的第三个选项只会禁用一个按钮。@如果是,但我会首先在其中添加所有按钮,然后将我想更改的按钮传递给函数。我不认为声明和枚举或数组会使逻辑更加清晰。
var buttons = <all buttons, todo>
foreach (var button in buttons) {
button.Enabled = !button.Contains((Buttons)button.Tag));
}