2011-08-16 20 views
10

En caso de bucle for puedo declarar el índice fuera de la instrucción for. Por ejemplo, en lugar dedeclarar la variable fuera del bucle foreach

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

que puedo hacer:

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

Ahora bien, en comparación con bucles Foreach, tengo que declarar la variable dentro del bucle:

foreach (string name in names) { } 

y no puedo haga algo como:

string name; 
foreach (name in names) { } 

La razón por la que esto me molesta es que después del ciclo quiero usar la variable "nombre" nuevamente. En el caso de un bucle foreach, la variable "nombre" no se puede usar porque está fuera del alcance de foreach, y no puedo declarar otra variable con el mismo nombre desde que se declaró anteriormente en el mismo ámbito.

¿Alguna idea?

+1

Estaría utilizando el nombre para iterar sobre la lista, ¿por qué necesita consultarla más adelante en su código? Creo que puedes codificar para evitar la necesidad de tal uso. –

+0

@Shamim Hafiz: Tengo un caso donde prefiero una variable con el mismo nombre que estaba en el ciclo foreach. – Naor

+0

Tuve el mismo problema. Utilizo un bucle foreach dentro de un try-catch y escribo en un log dentro del bloque try y catch. Utilizo la variable de elemento en el bucle foreach dentro de ambos registros. Terminé usando una variación de los primeros dos métodos de Jon Skeet. – seebiscuit

Respuesta

11

Bueno, se puede hacer:

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 más probable:

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

Si el contenido del bucle foreach es jus t para encontrar un elemento coincidente - los cuales al menos suena probable - entonces usted debe considerar si LINQ sería un mejor partido:

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

mediante LINQ a menudo puede hacer que el código que básicamente está tratando de encontrar algo un lote más fácil de leer.

+0

La búsqueda no es el problema aquí, pero proporciona una buena solución. – Naor

1

No se puede hacer esto en los bucles foreach. Está creando y utilizando una variable de rango cuyo alcance está limitado a la consulta foreach.

Si es necesario utilizar un nombre individual dentro de la colección de nombres, entonces puede asignarlo a un valor fuera del bucle foreach:

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

OP mencionó que el nombre permanece en el alcance más allá del cuerpo de foreach, ¿es cierto? –

+1

@Shamim. En mi ejemplo, el nombre de la variable no estará dentro del alcance de este bucle foreach. –

+0

Ah ok, creo que el OP es incorrecto sobre no poder usar "nombre" otra vez. –

1

¿Quizás?

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

¿Lo has probado? esto no funciona Si fuera así, no publicaría esta pregunta. – Naor

+0

Estoy seguro de que te perdiste algo de mi fragmento. En realidad, si lo compruebas, todas las respuestas aquí dan al menos esta solución. Ahora, me perdí la asignación nula, si quieres nitpick. – Vladimir

+0

tienes que cambiarlo a foreach (string tmp in names) de lo contrario no funcionará. +1 por la idea – Naor

Cuestiones relacionadas