在我的下面的代码中,我将我的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();
}
}
}
答案 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列表并逐个删除每一行。