IF语句多个条件,同一个语句

24

大家好,我想缩减我的 C# if 语句的代码量,因为有一些重复的因素,并想知道是否可能有更简单的解决方法。

我目前有两个 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。 - Stephen C
12个回答

50

使用 && (与) 运算符和 || (或) 运算符的嵌套条件语句,可以如下实现:

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

应该可以解决问题。


6
通常当我的if语句中的条件超过三个时,我会将它们提取到一个私有方法中,以清晰地表明条件是什么。 - Prashant Cholachagudda
@PrashantCholachagudda 我不明白将静态值抽象到其他地方如何有助于以任何方式区分它们的“本质”。你有没有一个例子或一篇文章来说明它是什么样子,以及它的好处是什么? - TylerH

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

12

我总是试图将复杂的布尔表达式分解成有意义的变量(基于这些列用于什么,您可能可以考虑更好的名称):

bool notColumnsABC = (columnname != a && columnname != b && columnname != c);
bool notColumnA2OrBoxIsChecked = ( columnname != A2 || checkbox.checked );

if (   notColumnsABC 
    && notColumnA2OrBoxIsChecked )
  {
      "statement 1"
  }

8

查看这个更加集中的条件检查方式:

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
    }

}

3

这不是一样的吗:

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

3
如果您认为这样更加清晰,那么也可以选择这种方法:
if (columnname != a 
  && columnname != b 
  && columnname != c
{
   if (checkbox.checked || columnname != A2)
   {
      "statement 1"
   }
}

2
如何尝试这样的方式?
    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

0

像 @sal 说的那样,C# 9.0 增加了更好的模式匹配。现在你可以使用 isand,以及 or.

有了这个,代码变成了:

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 (checkbox.checked)
  {
    if (columnname is (!= a and != b and != c)
    {
      "statement 1"
    }
  }
else
  {
    if (columnname is (!= a and != b and != c and != A2)
    {
      "statement 1"
    }
  }

这种模式匹配还以类似的方式清理了 switch 语句。绝对值得使用。

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

是简化一些的一种方式。


0

我认为agileguy的答案是正确的,但我想补充一下,在更困难的情况下,我采取了几种策略来解决问题。第一种是使用真值表。如果你在谷歌上搜索“真值表”,你会找到一些与编程和计算机科学直接相关的例子。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接