2012-01-26 10 views
5

Necesito averiguar cuál es el índice actual de la Fila dentro de un bucle foreach.Implementación limpia de almacenar el índice de la fila actual

foreach (DataRow row in DataTable[0].Rows) 
{ 
    // I do stuff in here with the row, and if it throws an exception 
    // I need to pass out the row Index value to the catch statement 
} 

Una excepción puede ocurrir en cualquier punto dentro del bloque try/catch, pero si uso un contador incremental dentro del bucle foreach, y la excepción se produce fuera del bucle, voy a conseguir una fila no válida porque' he movido el puntero por uno.

sé que puedo declarar una DataRow fuera del alcance foreach, pero el foreach está dentro de un bloque try/catch. Necesito pasar el índice de fila para poder usarlo en la declaración catch. Debo decir que mi DataTable está al alcance del nivel de clase.

¿Es esta la única forma de obtener el índice de Fila actual? ¿O hay una implementación más limpia?

EDITAR

Por lo tanto, tener más en cuenta esto, yo podría utilizar un int para almacenar el valor de la fila actual, e incrementar este valor, así:

int i = 0; 

try 
{ 
    // Some code here - which could throw an exception 
    foreach (DataRow row in DataTables[0].Rows) 
    { 
     // My stuff 
     i++; 
    } 
    // Some code here - which could throw an exception 
} 
catch 
{ 
    // Use the counter 
    DataRow row = DataTables[0].Rows[i]; 
} 

Sin embargo, si el foreach no lanza la excepción, entonces el valor de i será mayor que el número real de filas en la tabla. Obviamente, podría hacer i--; después del foreach loop, pero esto parece ser un realmente sucio hackeo.

+1

Declare una variable de contador fuera del 'try' e incremente para cada iteración de bucle. – Oded

+0

Estaba tratando de evitar hacer esto, solo en caso de que hubiera un elegante indexador que pudiera usarse. Aunque tal vez sea mi única solución. : o ( –

+0

) A veces, un ciclo simple para() funciona mejor que para cada uno. Este es uno de esos casos. –

Respuesta

0

una manera sucia es whrap en un bloque TryCatch adicional:

int i = 0; 
try 
{ 
    // Some code here - which could throw an exception 

    try{ 
     foreach (DataRow row in DataTables[0].Rows) 
     { 
      // My stuff 
      i++; 
     } 
     // Some code here - which could throw an exception 
    } 
    catch{ 
     i--; 
     throw; 
    } 

} 
catch 
{ 
    // Use the counter 
    DataRow row = DataTables[0].Rows[i]; 
} 

de esa manera usted seguramente sabe que la excepción se produce justo después del foreach o durring it, y siempre obtienes el iterador correcto.

+0

Terminé haciendo una solución similar a esto. –

+0

@NeilKnight, eso está sucio, pero de nuevo ahora tienes control total sobre esta excepción. Por cierto, ahora que lo pienso, si se separan los tipos de las excepciones, podría usar múltiples bloques catch. Quiero decir, si su declaración de foreach genera solo NullRefferenceException, podría atraparla por separado y disminuir la variable "i". esa sería una solución un poco más limpia. – Igarioshka

+0

Que es lo que hice en mi código: o) –

0

declara una variable de contador fuera de la oportunidad y de incremento para cada repetición del bucle:

+0

En realidad, esto no ayudará porque si ocurre una excepción después del 'foreach' luego tengo el número de fila incorrecto. –

+0

@NeilKnight - Tu descripción del problema no es correcta en este caso. Realmente dices que la excepción se emite dentro del' foreach' (en el bloque de comentarios). – Oded

+0

En realidad diga que "si arroja una excepción", una excepción puede ocurrir en cualquier lugar dentro del bloque 'try/catch' –

Cuestiones relacionadas