Чистая реализация хранения текущего индекса строки - PullRequest
5 голосов
/ 26 января 2012

Мне нужно выяснить, какой текущий индекс строки из цикла foreach.

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
}

Исключение может возникнуть в любой точке блока try/catch, но если я использую инкрементныйсчетчик в цикле foreach, и исключение происходит вне цикла, я получу недопустимую строку, потому что я переместил указатель на единицу.

Я знаю, что могу объявить DataRow вне области действия foreach, но foreach находится внутри блока try/catch.Мне нужно передать индекс строки, чтобы я мог использовать его в операторе catch.Я должен сказать, что мой DataTable находится на уровне класса.

Действительно ли это единственный способ получить текущий индекс строки?Или есть более чистая реализация?

РЕДАКТИРОВАТЬ

Итак, уделив больше внимания этому вопросу, я мог бы использовать int для хранения текущего значения строки и увеличенияэто значение примерно так:

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

Однако, если foreach не выдает исключение, значение i будет больше, чем фактическое количество строк в таблице.Очевидно, я мог бы сделать i--; после foreach цикла, но это похоже на действительно грязный хак.

Ответы [ 2 ]

0 голосов
/ 26 января 2012

грязный способ заключить его в дополнительный блок trycatch:

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

таким образом, вы точно знаете, что исключение выдается правильно после каждого foreach или во время него, и вы всегда получаете правильный итератор.

0 голосов
/ 26 января 2012

Объявите переменную-счетчик за пределами попытки и приращения для каждой итерации цикла:

int counter = 0;

try
{
    foreach (DataRow row in DataTable[0].Rows)
    {
        // Do stuff
        counter++
    }

    counter = -1;
    // Do other stuff
}
catch
{
    // Counter has index
    if (counter == -1)
    {
       // exception did not occur in loop
    }
    else
    {
       // exception did occur in loop
    }
}
...