简化复杂的If语句

时间:2014-02-27 19:58:52

标签: c#

好吧,我有一个Form,它接收Employee的级别,并使用一堆Checkboxes根据他的级别启用一些选项。然而,我面临的问题是,对于我的应用程序的逻辑,每个选项都有特定的级别范围,因此我创建了一个丑陋的IF范围检查语句,我相信有更好的方法可以实现。

CODE

if (level >= 1 && level < 3) {
    _items[0].Enabled = true;
    _items[1].Enabled = false;
    _items[2].Enabled = false;
    _items[3].Enabled = false;
    _items[4].Enabled = false;
    _items[5].Enabled = false;
    _items[6].Enabled = false;
    _items[7].Enabled = false;
}
else if (level >= 3 && level < 5) {
    _items[0].Enabled = true;
    _items[1].Enabled = true;
    _items[2].Enabled = false;
    _items[3].Enabled = false;
    _items[4].Enabled = false;
    _items[5].Enabled = false;
    _items[6].Enabled = false;
    _items[7].Enabled = false;
}
else if (level >= 5 && level < 7) {
    _items[0].Enabled = true;
    _items[1].Enabled = true;
    _items[2].Enabled = true;
    _items[3].Enabled = false;
    _items[4].Enabled = false;
    _items[5].Enabled = false;
    _items[6].Enabled = false;
    _items[7].Enabled = false;
}
else if (level >= 7 && level < 9) {
    _items[0].Enabled = true;
    _items[1].Enabled = true;
    _items[2].Enabled = true;
    _items[3].Enabled = true;
    _items[4].Enabled = false;
    _items[5].Enabled = false;
    _items[6].Enabled = false;
    _items[7].Enabled = false;
}
else if (level >= 9 && level < 11) {
    _items[0].Enabled = true;
    _items[1].Enabled = true;
    _items[2].Enabled = true;
    _items[3].Enabled = true;
    _items[4].Enabled = true;
    _items[5].Enabled = false;
    _items[6].Enabled = false;
    _items[7].Enabled = false;
}
else if (level >= 11 && level < 13) {
    _items[0].Enabled = true;
    _items[1].Enabled = true;
    _items[2].Enabled = true;
    _items[3].Enabled = true;
    _items[4].Enabled = true;
    _items[5].Enabled = true;
    _items[6].Enabled = false;
    _items[7].Enabled = false;
}
else if (level >= 13 && level < 15) {
    _items[0].Enabled = true;
    _items[1].Enabled = true;
    _items[2].Enabled = true;
    _items[3].Enabled = true;
    _items[4].Enabled = true;
    _items[5].Enabled = true;
    _items[6].Enabled = true;
    _items[7].Enabled = false;
}
else if (level >= 15 && level < 17) {
    _items[0].Enabled = true;
    _items[1].Enabled = true;
    _items[2].Enabled = true;
    _items[3].Enabled = true;
    _items[4].Enabled = true;
    _items[5].Enabled = true;
    _items[6].Enabled = true;
    _items[7].Enabled = true;
}

7 个答案:

答案 0 :(得分:18)

您可以通过一些数学来简化:

int on = (level+1)/2;
for (int i = 0 ; i != 8 ; i++) {
    _items[i].Enabled = (i < on);
}

第一行将1到16(包括1和16)范围内的数字转换为1到8(包括1和8)范围内的数字。然后循环遍历所有项目,并启用尽可能多的项目,如之前计算的on变量的值所示。

答案 1 :(得分:6)

你(可能)会失去性能,但它可以说更具可读性。选择你的毒药!性能差异取决于调用此频率的频率。

if(level >= 1) {
    _items[0].Enabled = level >= 1;
    _items[1].Enabled = level >= 3;
    _items[2].Enabled = level >= 5;
    _items[3].Enabled = level >= 8;
    _items[4].Enabled = level >= 9;
    _items[5].Enabled = level >= 11;
    _items[6].Enabled = level >= 13;
    _items[7].Enabled = level >= 15;
}

答案 2 :(得分:4)

一个选项,您可以使用Dictionary存储每个复选框索引的范围:

private static Dictionary<int, Tuple<int, int>> _Ranges = new Dictionary<int, Tuple<int, int>>() 
{ 
    { 0, Tuple.Create(1, 3) },{ 1, Tuple.Create(3, 5) },{ 2, Tuple.Create(5, 7) },{ 3, Tuple.Create(7, 9) },
    { 4, Tuple.Create(9, 11) },{ 5, Tuple.Create(11, 13) },{ 6, Tuple.Create(13, 15) },{ 7, Tuple.Create(15, 17) }
};

现在这个简洁的代码应该这样做:

for(int i = 0; i <= 7; i++)
{
    var range = _Ranges[i];
    _items[i].Enabled = level >= range.Item1 && level < range.Item2;
}

您还可以创建一个自定义Range类来封装此逻辑。

答案 3 :(得分:1)

将其转为类似的东西:

_items[0].Enabled = ( level >= 1 && level < 17 );
....

答案 4 :(得分:0)

摆脱其他人:

_items[0].Enabled = false;
_items[1].Enabled = false;
_items[2].Enabled = false;
_items[3].Enabled = false;
_items[4].Enabled = false;
_items[5].Enabled = false;
_items[6].Enabled = false;
_items[7].Enabled = false;
if (level >= 1) 
    _items[0].Enabled = true;
if (level >= 3) 
    _items[1].Enabled = true;
if (level >= 5) 
    _items[2].Enabled = true;
if (level >= 7) 
    _items[3].Enabled = true;
if (level >= 9) 
    _items[4].Enabled = true;
if (level >= 11) 
    _items[5].Enabled = true;
if (level >= 13) 
    _items[6].Enabled = true;
if (level >= 15 && level < 17) 
    _items[7].Enabled = true;

答案 5 :(得分:0)

您的安全级别似乎完全重叠

所以你不能做一些像

这样简单的事情
 _items[0].Enabled = (level >= 1);
 _items[1].Enabled = (level >= 3);
 _items[2].Enabled = (level >= 5);

等?

答案 6 :(得分:0)

我倾向于建议这种启用/禁用表单组件的方法是有缺陷的。最顶层的答案只能解决这个狭隘的案例,其中表格中的项目是有序的,并且与特权级别对应1到N ......

如果此应用程序使用任何类型的表示分离方案(MVC,MVVM等),那么通过数据绑定当然可以做到这一点。

但是即使在最天真的情况下,处理这种情况的更好方法是在复选框中添加一个权限级别标志(可能在WinForms中使用它们的标签,WPF中的附加属性等)并循环比较它们反对用户的当前特权。特权级别的复选框字典也可以很好地工作:

    Dictionary<Control, int> RequiredControlPrivilege;

    foreach(var item in _items)
    {
        if(RequiredControlPrivilege.Contains(item)
        {
            item.Enabled = RequiredControlPrivilege[item] >= CurrentLevel
        }
        else
        {
            item.Enabled = false //Default to false or change to true...
        }
    }