如何在循环内正确更新数据表

时间:2010-08-30 16:25:30

标签: c#

在我的下面的代码中,我将我的Arrarylist(称为电子邮件)中的值(电子邮件地址)与我的Datatable(称为dtResult)中的值进行比较。我希望能够从数据表中删除行,如果它有一个在arraylist中找到的电子邮件地址,但我开始认为我最好创建一个没有那些行的新数据表(我只是不知道该怎么做)。显然我删除了一行之后的代码,因为它在foreach循环中失去了位置。我该如何解决这个问题?

感谢。

foreach (DataRow row in dtResult.Rows)
{
  var tmpl = row[3];
  for (int x = 0; x < emails.Count; x++)  //emails is an ArrayList of email addresses
  {
    string one = emails[x].ToString().ToUpper();
    string two = tmpl.ToString().ToUpper();
    //compare datatable value to arraylist value..
    if (one == two)
    {
      //if they are equal then I want to remove them (or maybe create a new datatable??)
      dtResult.Rows.Remove(row);
      dtResult.AcceptChanges();
    }
  }
}

3 个答案:

答案 0 :(得分:4)

最简单的方法是向后循环DataTable

for (int i = dtResult.Rows.Count - 1; i >= 0; i--)
{
    var row = dtResult.Rows[i];
    // ...
}

您还可以考虑是否可以将这些行上的row state标记为已删除(然后再观察该状态),而不是实际将其从表中删除。

答案 1 :(得分:2)

您可以反向浏览DataTable

for(int i  = dtResult.Rows.Count; i >= 0; i--)
{
     foreach(object email in emails)
     {
          if(email.ToString().ToUpper() == dtResult[i].ToString().ToUpper())
          {
               dtResult.Rows.Remove(dtResult.Rows[i]);
               dtResult.AcceptChanges();
          }
     }
}

答案 2 :(得分:1)

为什么不分两步完成?

我没试过这个,所以让我知道它是怎么回事。

var deleteRows = new List<DataRow>();

然后在你的循环中,而不是立即删除行,只需将行添加到列表中:

deleteRows.Add(row);

在遍历数据库之后,循环遍历deleteRows列表并逐个删除每一行。