避免在if-else阶梯中重复条件

时间:2019-02-02 07:31:11

标签: c# winforms

我有四个复选框。下面是我的代码。我的问题是如何避免检查状态组合的代码重复。

代码:

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

         }
         else
         {

         }
      }
      else
      {
         if (chk4.Checked)
         {

         }
         else
         {

         }
      }
   }
}

与其他部分相同。

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

2 个答案:

答案 0 :(得分:1)

一种选择是预先构建动作字典。

例如,

    gtk_box_pack_start (GTK_BOX (vbox), view, TRUE, TRUE, 0);

答案 1 :(得分:0)

如果您只是想知道如何访问复选框的每种组合,则可以执行自己的操作,也可以合并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) 
...

或者想了解 Bits 二进制文字(C#7)和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;
}

注意 :我不太确定最后一个选项是否更干净,因为我只想使用二进制文字,所以更多。 IFS的可能是最好的选择

或受到其他答案的启发

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