2009-08-27 16 views
11

Ciao a tutti, cercando di ridurre il codice sul mio C# se le affermazioni in quanto vi sono diversi fattori ripetitivi e mi chiedevo se fosse possibile una soluzione trimmer.SE Dichiarazione condizioni multiple, stessa dichiarazione

Attualmente sono presenti 2 istruzioni if ​​che devono eseguire un'istruzione identica, tuttavia l'unica variabile è una condizione aggiuntiva su un'istruzione if se una casella di controllo non è selezionata. Im solo chiedendo se c'è un modo per renderlo uno dichiarazioni o rendere la variabile di condizione di stringa, ecco la versione compressa del codice:

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

la sua, come ho bisogno di correre un'istruzione if all'interno delle condizioni di un se dichiarazione se questo ha un senso, come questa forma pseudo:

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

BTW - t la stessa risposta funziona in C, C++ e Java. –

risposta

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

dovrebbe fare il trucco.

+3

di solito quando le mie condizioni in un'istruzione if sono più di tre, le estro ad un metodo privato solo per chiarire qual è la condizione –

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

è un modo per semplificare un po '.

3

questa non è la stessa:

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

Si potrebbe anche fare questo se si pensa che è più chiaro:

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

Penso agileguy ha la risposta corretta, ma mi piacerebbe aggiungo che per situazioni più difficili ci sono un paio di strategie che prendo per risolvere il problema. Il primo è usare un truth table. Se tu "la tabella della verità" di Google ti imbatterai in alcuni esempi relativi direttamente alla programmazione e all'informatica.

Un'altra strategia che prendo è quella di utilizzare una funzione anonima per incapsulare la logica comune tra varie condizioni. Crealo subito prima del blocco if, quindi usalo dove necessario. Questo sembra creare codice che sia più leggibile e mantenibile.

6

cerco sempre di scomporre complesse espressioni booleane in variabili significative (si potrebbe forse pensare a nomi migliori sulla base di ciò che queste colonne sono utilizzati per):

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

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

Abbastanza vecchia questione ma controllare questo per una maggiore modo cluster di condizioni di controllo:

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

utilizzo:

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

} 
Problemi correlati