清理存储当前行索引的实现

时间:2012-01-26 11:08:29

标签: c# datatable implementation

我需要找出foreach循环中当前Row索引的内容。

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范围内。我需要传递Row索引,以便我可以在catch语句中使用它。我应该说我的DataTable属于班级范围。

这真的是获取当前Row索引的唯一方法吗?或者是否有更清洁的实施?

修改

因此,考虑到这一点,我可以使用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进行{{1}},但这似乎是真的脏黑客。

2 个答案:

答案 0 :(得分:0)

在try之外声明一个计数器变量并为每次循环迭代递增:

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

答案 1 :(得分:0)

一种肮脏的方法是将其包装在另一个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或者它之前被抛出,并且你总是得到正确的迭代器。