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.
Dichiarare una variabile contatore al di fuori di 'try' e incrementare per ogni iterazione del ciclo. – Oded
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 ( –
A volte un ciclo for() normale funziona meglio di per-ciascuno.Questo è uno di quei casi. –