2011-08-16 15 views
10

In caso di loop, posso dichiarare l'indice all'esterno dell'istruzione for. Ad esempio, invece didichiarare la variabile all'esterno del ciclo foreach

for (int i = 0; i < 8; i++) { } 

posso fare:

int i; 
for (i = 0; i < 8; i++) { } 

Ora, in confronto al Ciclo Foreach, devo dichiarare la variabile all'interno del ciclo:

foreach (string name in names) { } 

e non posso fare qualcosa come:

string name; 
foreach (name in names) { } 

La ragione per cui mi dà fastidio è che dopo il ciclo voglio usare di nuovo la variabile "nome". In caso di ciclo foreach, la variabile "nome" non può essere utilizzata poiché è al di fuori dell'ambito foreach e non posso dichiarare un'altra variabile con lo stesso nome poiché dichiarata prima nello stesso ambito.

Qualche idea?

+1

Si utilizzerà il nome per scorrere l'elenco, perché è necessario fare riferimento ad esso più avanti nel codice. Penso che puoi programmare per evitare la necessità di tale utilizzo. –

+0

@Shamim Hafiz: ho un caso in cui preferisco una variabile con lo stesso nome del ciclo foreach. – Naor

+0

Ho avuto lo stesso problema. Io uso un ciclo foreach all'interno di un try-catch e scrivo su un log all'interno del blocco try e catch. Io uso la variabile item nel ciclo foreach all'interno di entrambi i log. Ho finito per usare una variazione dei primi due metodi di Jon Skeet. – seebiscuit

risposta

11

Beh, si può fare:

string name = null; // You need to set a value in case the collection is empty 
foreach (string loopName in names) 
{ 
    name = loopName; 
    // other stuff 
} 

O più probabilmente:

string name = null; // You need to set a value in case the collection is empty 
foreach (string loopName in names) 
{ 
    if (someCondition.IsTrueFor(loopName) 
    { 
     name = loopName; 
     break; 
    } 
} 

Se il contenuto del ciclo foreach è jus t per trovare un elemento di corrispondenza - cui almeno suoni probabile - allora si dovrebbe considerare se LINQ sarebbe una migliore corrispondenza:

string name = names.Where(x => x.StartsWith("Fred")) 
        .FirstOrDefault(); 

utilizzando LINQ può spesso rendere il codice che è fondamentalmente cercando di trovare qualcosa di un Lotto più semplice da leggere.

+0

La ricerca non è il problema qui, ma fornisce una buona soluzione. – Naor

1

Non è possibile farlo in foreach loop. Stai creando e utilizzando una variabile di intervallo il cui ambito è limitato alla query foreach.

Se è necessario utilizzare un nome individuale all'interno della collezione nomi allora si può assegnare un valore al di fuori del ciclo foreach:

foreach(string name in names) 
{ 
    if(name == someCondition) 
     someVariable = name; 
} 
+0

l'OP ha menzionato che il nome rimane sullo scope oltre il corpo di foreach, è vero? –

+1

@Shamim. Nel mio esempio, il nome della variabile non rientrerà nell'ambito di questo ciclo foreach. –

+0

Ah ok, immagino che l'OP abbia sbagliato a non essere in grado di usare di nuovo "nome". –

1

Forse?

string name; 
foreach (var tmp in names) { name = tmp; } 
+0

Hai provato? questo non funziona Se lo fosse, non vorrei pubblicare questa domanda. – Naor

+0

Sono sicuro che ti sei perso qualcosa dal mio snippet. In realtà, se lo verifichi, tutte le risposte qui danno almeno questa soluzione. Ora, ho perso l'assegnazione nulla, se vuoi fare il pasticcio. – Vladimir

+0

devi cambiarlo in foreach (stringa tmp nei nomi) altrimenti non funzionerà. +1 per l'idea. – Naor