如何删除DataTable中的多行?

pen*_*ake 30 .net c# datatable ado.net datarow

如何在符合自定义条件的DataTable行的循环中删除特定的DataRows -lets表示索引为偶数的行?(不使用LINQ)

谢谢

LBu*_*kin 58

这取决于你的'删除'是什么意思.

如果你的意思是将它们标记为已删除,只需Delete()在循环中访问它时调用每一行上的方法.然后,您需要调用AcceptChanges()数据表来完成删除 - 可能是在您更新数据库之后(如果涉及).

foreach( DataRow row in someTable.Rows )
{
    if( /* your condition here */ )
        row.Delete();
}
someTable.AcceptChanges();
Run Code Online (Sandbox Code Playgroud)

如果您的意思是从DataTable中删除它,那么您需要在两次传递中执行此操作:

List<DataRow> rowsToDelete = new List<DataRow>();
foreach( DataRow row in someTable.Rows )
{
    if( /* your condition here */ )
    {
        rowsToDelete.Add( row );
    }
}

foreach( DataRow row in rowsToDelete )
{
    someTable.Rows.Remove( row );
}
Run Code Online (Sandbox Code Playgroud)

值得指出的是,您总是可以使用第一种方法来删除行 - 因为将行标记为Deleted然后接受更改将自动从表中删除它们.但是,有时只需DataRowRows集合中删除对象就更清晰有效.

  • 如果你像LBushkin所说的那样做,你会看到如下:收集被修改; 枚举操作可能无法执行.所以这是错的. (4认同)
  • 只要在将行标记为已删除(在foreach循环之前)之前调用.AcceptChanges(),那么您将无法获得"集合已被修改;枚举操作可能无法执行"错误.出现错误是因为存在需要接受的挂起更改.如果你使用for循环则无关紧要,但在这种情况下,最好向后迭代. (2认同)
  • 因为函数改变了集合的状态,所以不推荐在`foreach`循环中使用`Remove()`. (2认同)

Ant*_*ram 9

尝试这样的例子

DataTable table = new DataTable();
table.Columns.Add("Foo",typeof(int));
for (int i = 0; i < 10; i++)
    table.Rows.Add(i);

for (int i = table.Rows.Count -1; i >=0; i--)
{
    // sample removes all even foos
    if ((int)table.Rows[i]["Foo"] % 2 == 0)
        table.Rows.RemoveAt(i);
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*gey 5

如果您想要比上面建议的解决方案更短的解决方案,请尝试遍历结果列表,并使用lambda 之类的sub(x)方法删除每一行。

dt.Select("Column1 > 0").ToList.ForEach(Sub(x) dt.Rows.Remove(x))
Run Code Online (Sandbox Code Playgroud)