2013-09-24 18 views
5

Questo è il mio codice:ciclo while in C# con più condizioni

while(Func(x) != ERR_D) 
{ 
    if(result == ERR_A) 
     throw...; 
    if(result == ERR_B) 
     throw...; 

    mydata.x = x; 
} 

Il problema è che io voglio usare result = Func(x) nella condizione, mentre in seguito sarà controllato all'interno del ciclo while. Il ciclo while dovrebbe chiamare Func(x) fino a quando non restituisce ERR_D. Non posso usare

do{ 
    result = Func(x); 
    if(result == ERR_A) 
     throw ...; 
    if(result == ERR_B) 
     throw ...; 
    mydata.x = x; 
    }while(result != ERR_D); 

nel mio progetto come chiama prima Func(x) che è quello che non voglio. Ma ho provato while(result = Func(x) != ERR_D), non funziona. Qualche idea per risolvere questo?

+2

Beh, 'x' non cambia mai. Forse ha qualcosa a che fare con questo? Difficile a dirsi, dal momento che "non funziona" potrebbe significare quasi tutto e non abbiamo idea di cosa dovrebbe succedere. –

+0

'var result = Func (x); while (risultato! = ERR_D) {doStuff(); risultato = Func (x); } '? – Corak

+0

Ha davvero senso gettare le eccezioni in un ciclo? il ciclo terminerà non appena ne viene lanciato uno ... –

risposta

8

Hai solo bisogno di aggiungere alcune parentesi:

while((result = Func(x)) != ERR_D) { /* ... */ } 

L'operatore != ha una priorità più alta rispetto l'assegnazione, in modo da è necessario forzare il compilatore a eseguire prima il compito (che valuta il valore assegnato in C#), prima di confrontare i valori su entrambi i lati dell'operatore != l'uno con l'altro. Questo è un modello che si vede molto spesso, ad esempio per leggere un file:

string line; 

while ((line = streamReader.ReadLine()) != null) { /* ... */ } 
+0

buona spiegazione – Heidi

2

Prova questo:

while((result=Func(x)) != ERR_D){ 
if(result == ERR_A) 
     throw...; 
if(result == ERR_B) 
     throw...; 
mydata.x = x; 
} 

NOTA: l'assegnazione è fatta per prima tra parentesi (result=Func(x)), questa assegnazione è infatti fatto da sovraccarico dell'operatore = e questo operatore restituisce il riferimento alla sinistra operando laterale, ovvero result. Successivamente, lo result verrà confrontato con lo ERR_D tramite l'operatore !=.

+0

Grazie, funziona. – Heidi

6

Provare a dichiarare result fuori dal ciclo e assegnarlo a Funcs valore di ritorno su ciascuna iterazione.

Per esempio:

var result = Func(x); 

while(result != ERR_D) 
{ 
    if(result == ERR_A) 
     throw...; 
    if(result == ERR_B) 
     throw...; 

    mydata.x = x; 
    result = Func(x); 
} 
1

Prova

while((result = Func(x)) != ERR_D) 
0

Si potrebbe esprimere questo utilizzando un while (true)...:

while (true) 
{ 
    var result = Func(x); 

    if (result == ERR_D) 
     break; 

    if (result == ERR_A) 
     throw ...; 

    if (result == ERR_B) 
     throw ...; 

    mydata.x = x;    
} 

Si tratta di un loop-con-un-uscita (se si ignora i lanci;)) quindi è un loop strutturato.

si potrebbe anche utilizzare un ciclo for, anche se sembra un po 'eccentrico (gioco di parole non destinato!):

for (var result = Func(x); result != ERR_D; result = Func(x)) 
{ 
    if (result == ERR_A) 
     throw ...; 

    if (result == ERR_B) 
     throw ...; 

    mydata.x = x;  
}