IF语句多个条件,相同的声明

嘿所有,希望减少我的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}) 

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

应该做的伎俩。

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

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

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

相当古老的问题,但检查这是一种更集群的检查条件方式:

 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 ABC column } } 

这不是一样的:

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

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

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

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

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

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

是一种简化一点的方法。