Simplify Complex if statements

Well, I have a Form that receives an Employee level and includes some parameters depending on its level, using a bunch Checkboxes. However, the problem I ran into is that for my application logic there is a certain range of levels for each option, so I created Ugly IF, checking the range, which I am sure there is a better way to achieve.

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;
}
+4
source share
7 answers

You can simplify this with a little math:

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

1 16 1 8 . , on, .

+18

() , , , . ! , .

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

, 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 , .

+4

:

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

elses:

_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;
0

, - ,

 _items[0].Enabled = (level >= 1);
 _items[1].Enabled = (level >= 3);
 _items[2].Enabled = (level >= 5);

..?

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...
        }
    }
0

Source: https://habr.com/ru/post/1529286/


All Articles