更有效地排序枚举数组

时间:2012-07-09 11:12:51

标签: c# enums performance

目前,我的Winform上有一些按钮需要根据用户点击的不同点进行禁用/启用。

我制作的初稿是

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;
        }
    }
}

我仍然对此并不满意。我可以废弃switch-caseforeach

private void DisableButtons(params Buttons[] buttons)
{
    button1.Enabled = buttons.Contains(Buttons.Button1) ? false : true;
}

每个按钮但我认为必须有更好的方法。

关于如何更有效地做到这一点的任何想法?

由于

2 个答案:

答案 0 :(得分:1)

您可以将上一个代码行缩短为:

button1.Enabled = !buttons.Contains(Buttons.Button1);

替代解决方案

或者您可以使用每个按钮的Tag属性为每个按钮设置枚举值。

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));
}

答案 1 :(得分:1)

我建议您实际上不要创建一个灵活启用和禁用任何按钮组合的功能,因为您还没有完成Form的工作方式。当然,这可能会为您节省几行代码,但是,它不会将任何上下文信息传递给维护代码的下一个开发人员。它也不会比直接设置控件的状态运行得快。

我会在你的Form更改状态时调用一个函数,该函数将获取与Form状态相关的所有可能参数。然后我将解码这些参数,并使用传统的switchif声明,在一次传递中按名称显式设置表单上控件的状态。

这个核心功能将使您和未来的开发人员清楚地了解您的状态如何变化以及预期控件的行为方式。它不会以不必要的抽象级别降低代码的性能。