2015-06-10 23 views
5

Questo è il mio se-economico al momento:Ridurre il se-dichiarazione stessa

if (excel_getValue("A" + i) == "" && 
    excel_getValue("A" + (i + 1)) == "" && 
    excel_getValue("A" + (i + 2)) == "" && 
    excel_getValue("A" + (i + 3)) == "" && 
    excel_getValue("A" + (i + 4)) == "" && 
    excel_getValue("A" + (i + 5)) == "" && 
    excel_getValue("A" + (i + 6)) == "" && 
    excel_getValue("A" + (i + 7)) == "" && 
    excel_getValue("A" + (i + 8)) == "") 

C'è qualche cosa che può ridurre questa affermazione? Dovrei costruire questa if-statement in un ciclo for?

BTW, questo se-dichiarazione, se già in una forloop e utilizza la i del forloop

+0

Si può cambiare la logica in excel_getValue o aggiungere un'altra funzione? –

risposta

19

È possibile utilizzare All:

if(Enumerable.Range(0, 9).All(c => excel_getValue("A" + (i + c)) == "")) { 
} 
+0

Mi hai battuto nella parte linq :-) – Jcl

+1

Funziona come un treno! grazie! – wouter

+0

provare a utilizzare le funzioni predefinite come string.isNullOrEmpty() per verificare una stringa vuota –

2

C'è un modo semplice per "ridurre" (almeno "abbellire") con un ciclo for ... questo non sarebbe più performante, però, in modo da scegliere:

bool do = true; 
for(var j = 0; j < 9; j++) { 
    if (excel_getValue("A" + (i+j)) != "") { 
    do = false; 
    break; 
    } 
} 
if(do) { /* whatever */ } 

o utilizzando Linq:

if(Enumerable.Range(0, 9).All(x => excel_getValue("A" + (i + x)) == "")) { /* whatever */ } 

Questo potrebbe essere probabilmente ridotto facilmente, ma credo che il punto è che s dovrebbe essere "più carino" e non "migliore" o "complicato". Nulla sarebbe battere il tuo originale in termini di prestazioni :-)

+0

Non solo più carino, ma più facile da leggere e capire dopo il fatto, piuttosto che dover controllare ogni termine in se per sottili differenze. Anche la differenza di prestazioni probabilmente non sarà evidente da un utente per la maggior parte dei casi d'uso. – Paddy

+0

@Paddy d'accordo, ecco perché ho creato il primo ciclo "totalmente prolisso" – Jcl

0

Sì, un ciclo for è un buon modo per semplificare il codice in questo caso. Qualcosa di simile:

bool result = true; 
    for(int j = 0; j < max; j++) 
    { 
     result = result && excel_getValue("A" + (i + j)) == ""; 
    } 
0

Si potrebbe provare qualcosa di simile:

if (Enumerable.Range(0, 8).All(p => excel_getValue("A" + (i + p)) == ""))