2009-08-27 96 views
11

嘿所有,寻找减少我的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 (columnname != a 
    && columnname != b 
    && columnname != c 
    && if(checkbox.checked{columnname != A2}) 
+0

BTW - T的他同样的答案适用于C,C++和Java。 – 2009-08-27 14:42:02

回答

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

应该做的伎俩。

+3

通常当我在if语句中的条件超过三个时,我将它们提取到一个私有方法中,只是为了清楚它的条件是什么 – 2013-12-13 10:46:49

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

是简化一点的方法之一。

3

这难道不是一样的:

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

你也可以做到这一点,如果你认为它更清楚:

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

我认为agileguy有正确的答案,但我想补充说,对于更困难的情况,我会采取几个策略来解决问题。首先是使用truth table。如果你是谷歌的“真相表”,你会遇到一些与编程和计算机科学直接相关的例子。

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

6

我总是试图把复杂的布尔表达式分解出成有意义的变量(这些列用于你很可能认为基于更好的名字):

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

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

很老的问题,但检查了这一个更抽查情况集群方式:

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 
    } 

}