2012-01-26 10 views
5

Ho bisogno di scoprire quale sia l'indice Row corrente all'interno di un ciclo foreach.Pulizia dell'implementazione dell'indice di riga corrente di memorizzazione

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 
} 

Un'eccezione può verificarsi in qualsiasi punto all'interno del blocco try/catch, ma se uso un contatore incrementale all'interno del ciclo foreach, e l'eccezione avviene al di fuori del ciclo, prendo una riga valida perché I' ve ha spostato il puntatore di uno di essi.

So che posso dichiarare una DataRow al di fuori del campo di applicazione foreach, ma il foreach è all'interno di un blocco try/catch. Devo passare l'indice Row in modo da poterlo utilizzare nell'istruzione catch. Devo dire che il mio DataTable è a livello di classe.

Questo è davvero l'unico modo per ottenere l'indice di riga corrente? O c'è un'implementazione più pulita?

EDIT

Così, dando più pensiero a questo, potrei usare un int per memorizzare il valore riga corrente, e incrementare questo valore in questo modo:

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

Tuttavia, se il foreach non lancia l'eccezione, quindi il valore di i sarà maggiore del numero effettivo di righe nella tabella. Ovviamente, potrei fare i--; dopo il ciclo foreach, ma questo mi sembra uno davvero un vero e proprio trucco.

+1

Dichiarare una variabile contatore al di fuori di 'try' e incrementare per ogni iterazione del ciclo. – Oded

+0

Stavo cercando di evitare di fare questo, solo nel caso in cui ci fosse un indicizzatore di fantasia che poteva essere usato. Forse è la mia unica soluzione però. : o ( –

+0

A volte un ciclo for() normale funziona meglio di per-ciascuno.Questo è uno di quei casi. –

risposta

0

un modo sporco è quello di whrap in un blocco TryCatch aggiuntivo:

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

in questo modo è sicuramente sai che l'eccezione viene lanciata a destra per foreach o durring, e ottieni sempre l'iteratore corretto.

+0

Ho finito per fare una soluzione simile a questo. –

+0

@NeilKnight bene, che è sporco, ma poi di nuovo ora hai il pieno controllo su questa eccezione. A proposito, ora che ci penso, se si separano i tipi di eccezioni, è possibile utilizzare più blocchi catch. Voglio dire, se la tua istruzione foreach genera solo NullRefferenceException, puoi prenderla separatamente e decrementare la variabile "i". sarebbe una soluzione un po 'più pulita. – Igarioshka

+0

Quale è quello che ho fatto nel mio codice: o) –

0

dichiarare una variabile contatore al di fuori della prova e di incremento per ogni iterazione del ciclo:

+0

In realtà, questo non aiuterà perché se si verifica un'eccezione dopo il 'foreach', quindi ho il numero di riga errato –

+0

@NeilKnight - La tua descrizione del problema non è corretta in questo caso.In realtà dici che l'eccezione è lanciata all'interno di' foreach' (nel blocco dei commenti) – Oded

+0

diciamo che "se lancia un'eccezione", può verificarsi un'eccezione ovunque all'interno del blocco "try/catch" –