代码之家  ›  专栏  ›  技术社区  ›  ksdev

避免在if else梯形图中重复出现这种情况

  •  0
  • ksdev  · 技术社区  · 7 年前

    if (chk1.Checked)
    {
       if (chk2.Checked)
       {
          if (chk3.Checked)
          {
             if (chk4.Checked)
             {
    
             }
             else
             {
    
             }
          }
          else
          {
             if (chk4.Checked)
             {
    
             }
             else
             {
    
             }
          }
       }
    }
    

    编辑:如果条件为true,我只想在字符串列表中添加一项。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Anu Viswan    7 年前

    一个选择是预先建立一个动作字典。

    例如

    var states = new[]
                    { 
                        new { Checkboxes= new []{chk1,chk2,chk3,chk4},Action = new Action(()=>{ /* Do something */ })},
                        new { Checkboxes= new []{chk1,chk2,chk3},Action = new Action(()=>{ /* Do something */ })},
                        new { Checkboxes= new []{chk1,chk2,chk4},Action = new Action(()=>{ /* Do something */})},
                    // and so on
                    };
    
    
    states.First(x=>x.Checkboxes.All(c=>c.Checked)).Action();
    
        2
  •  0
  •   TheGeneral    7 年前

    if s

    if (chk1.Checked && chk2.Checked && chk3.Checked && chk4.Checked)
    // do something
    else if (chk1.Checked && chk2.Checked && chk3.Checked && !chk4.Checked) 
    // do something
    else if (chk1.Checked && chk2.Checked && !chk3.Checked && chk4.Checked) 
    ...
    

    或是为了得到一点幻想 位 , 二进制字面值 switch 你可以这样做

    int BoolsToInt(params bool[] values) 
         => values.Aggregate(0, (current, value) => current << (value ? 1 : 0));
    
    ...
    
    var val = BoolsToInt(chk1.Checked, chk2.Checked, chk3.Checked, chk4.Checked);
    switch (val)
    {
       case 0b0000: break;
       case 0b0001: break;
       case 0b0010: break;
       case 0b0011: break;
       case 0b0100: break;
       case 0b0101: break;
       case 0b0110: break;
       case 0b0111: break;
       case 0b1000: break;
       case 0b1001: break;
       case 0b1010: break;
       case 0b1011: break;
       case 0b1100: break;
       case 0b1101: break;
       case 0b1110: break;
       case 0b1111: break;
    }
    

    :我不确定最后一个选项是否更干净,因为我只想使用二进制文字。国际单项体育联合会可能是最好的选择

    或者受到另一个答案的启发

    private static Dictionary<int, Action> _dict;
    
    ...
    
    _dict = new Dictionary<int, Action>()
                   {
                      { 0b0000, () => DoStuff0() },
                      { 0b0001, () => DoStuff1() },
                      { 0b0010, () => DoStuff2() },
                      { 0b0011, () => DoStuff3() },
                      { 0b0100, () => DoStuff4() },
                      { 0b0101, () => DoStuff5() },
                      { 0b0110, () => DoStuff6() },
                      { 0b0111, () => DoStuff7() },
                      { 0b1000, () => DoStuff8() },
                      { 0b1001, () => DoStuff9() },
                      { 0b1010, () => DoStuff10() },
                      { 0b1011, () => DoStuff11() },
                      { 0b1100, () => DoStuff12() },
                      { 0b1101, () => DoStuff13() },
                      { 0b1110, () => DoStuff14() },
                      { 0b1111, () => DoStuff15() },
                   };
    

    用法

    var combination = BoolsToInt(chk1.Checked, chk2.Checked, chk3.Checked, chk4.Checked);
    dict[combination].Invoke();