2009-08-27 13 views
11

Hola a todos, buscando reducir el código en mi C# si las declaraciones ya que hay varios factores que se repiten y me preguntaba si es posible una solución de recortadora.SI Declaración de condiciones múltiples, misma declaración

Actualmente tengo 2 if declaraciones que deben llevar a cabo una declaración idéntica, sin embargo, la única variable es una condición adicional en una declaración if cuando no está marcada una casilla de verificación. Estoy preguntando si hay una manera de hacer que una declaración o hacer que la variable de cadena estado, aquí está la versión comprimida del código:

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

es como se necesita para ejecutar una sentencia if dentro de las condiciones de un caso declaración si eso tiene sentido, al igual que esta forma pseudo:

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

BTW - t La misma respuesta funciona en C, C++ y Java. –

Respuesta

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

debe hacer el truco.

+3

generalmente cuando mis condiciones en una declaración if son más de tres, las extracto a un método privado solo para aclarar cuál es la condición –

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" 
    } 

es una manera de simplificar un poco.

3

No es éste el mismo:

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

También puede hacer esto si creo que es más claro:

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

Creo agileguy tiene la respuesta correcta, pero me gustaría agregue que para situaciones más difíciles hay un par de estrategias que tomo para resolver el problema. El primero es usar un truth table. Si busca en Google "tabla de verdad", encontrará algunos ejemplos relacionados directamente con la programación y la informática.

Otra estrategia que tomo es utilizar una función anónima para encapsular la lógica común entre varias condiciones. Créelo justo antes del bloque if, luego úselo donde sea necesario. Esto parece crear código que es más legible y mantenible.

6

Siempre trato de factorizar expresiones booleanas complejas en variables significativas (que probablemente se podría pensar en mejores nombres en base a lo que se utilizan estas columnas para):

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

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

Bastante vieja pregunta, pero echa esto para una mayor manera agrupada de las condiciones de cheques:

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

uso:

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

} 
Cuestiones relacionadas