【问题标题】:IF Statement multiple conditions, same statementIF 语句多个条件,同一个语句
【发布时间】:2009-08-27 14:32:57
【问题描述】:

大家好,我希望减少我的 c# if 语句中的代码,因为有几个重复因素,并且想知道是否可以使用微调解决方案。

我目前有 2 个 if 语句需要执行相同的语句,但是唯一的变量是在未选中复选框时 if 语句上的额外条件。我只是想知道是否有办法使它成为一个语句或使条件字符串变量,这是代码的压缩版本:

if (checkbox.checked)
  {
    if (columnname != a && columnname != b && columnname != c)
    {
      "statement 1"
    }
  }
else
  {
    if (columnname != a && columnname != b && columnname != c 
        && columnname != A2)
    {
      "statement 1"
    }
  }

如果有意义的话,我需要在 if 语句的条件下运行 if 语句,就像这个伪形式:

if (columnname != a 
    && columnname != b 
    && columnname != c 
    && if(checkbox.checked{columnname != A2})

【问题讨论】:

  • 顺便说一句——同样的答案适用于 C、C++ 和 Java。

标签: c#


【解决方案1】:
if (columnname != a 
  && columnname != b 
  && columnname != c
  && (checkbox.checked || columnname != A2))
{
   "statement 1"
}

应该做的伎俩。

【讨论】:

  • 通常当我在 if 语句中的条件超过三个时,我会将它们提取到私有方法中,以明确条件是什么
【解决方案2】:
if (columnname != a && columnname != b && columnname != c 
        && (columnname != A2 || checkbox.checked))
    {
      "statement 1"
    }

【讨论】:

    【解决方案3】:

    我总是尝试将复杂的布尔表达式分解为有意义的变量(根据这些列的用途,您可能会想到更好的名称):

    bool notColumnsABC = (columnname != a && columnname != b && columnname != c);
    bool notColumnA2OrBoxIsChecked = ( columnname != A2 || checkbox.checked );
    
    if (   notColumnsABC 
        && notColumnA2OrBoxIsChecked )
      {
          "statement 1"
      }
    

    【讨论】:

      【解决方案4】:

      相当老的问题,但请检查此问题以获得更集中的检查条件:

      private bool IsColumn(string col, params string[] names) => names.Any(n => n == col);
      

      用法:

      private void CheckColumn()
      {
           if(!IsColumn(ColName, "Column A", "Column B", "Column C"))
          {
           //not A B C column
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        这不一样吗:

        if ((checkbox.checked || columnname != A2) && 
                columnname != a && columnname != b && columnname != c)
          {
              "statement 1"
          }
        

        【讨论】:

          【解决方案6】:

          如果您认为它更清楚,您也可以这样做:

          if (columnname != a 
            && columnname != b 
            && columnname != c
          {
             if (checkbox.checked || columnname != A2)
             {
                "statement 1"
             }
          }
          

          【讨论】:

            【解决方案7】:

            我认为 Agileguy 有正确的答案,但我想补充一点,对于更困难的情况,我会采取一些策略来解决问题。第一种是使用truth table。如果您在 Google 上搜索“真值表”,您会遇到一些与编程和计算机科学直接相关的示例。

            我采取的另一种策略是使用匿名函数来封装各种条件之间的通用逻辑。在 if 块之前创建它,然后在需要的地方使用它。这似乎创建了更具可读性和可维护性的代码。

            【讨论】:

              【解决方案8】:

              这样的事情怎么样?

                  var condCheck1 = new string[]{"a","b","c"};
                  var condCheck2 = new string[]{"a","b","c","A2"}
              
                  if(!condCheck1.Contains(columnName) && !checkbox.checked)
                      //statement 1
                  else if (!condCheck2.Contains(columnName))
                      //statment 2
              

              【讨论】:

                【解决方案9】:
                if (checkbox.checked && columnname != a && columnname != b && columnname != c)
                    {
                      "statement 1"
                    }
                else if (columnname != a && columnname != b && columnname != c 
                        && columnname != A2)
                    {
                      "statement 1"
                    }
                

                是一种稍微简化的方法。

                【讨论】:

                  【解决方案10】:
                  var test = new char[] {a, b, c}.Contains(columnname));
                  
                  if(test)
                  {
                    "true statement"
                  }
                  else
                  {
                     "false statement"
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2013-12-17
                    • 2017-09-25
                    • 1970-01-01
                    • 2015-07-08
                    • 2017-05-06
                    • 2014-09-06
                    • 2015-01-20
                    • 2013-11-17
                    • 2015-03-24
                    相关资源
                    最近更新 更多