当前位置:  开发笔记 > 编程语言 > 正文

DataTable,如何有条件地删除行

如何解决《DataTable,如何有条件地删除行》经验,为你挑选了3个好方法。

我参与了一个C#学习过程,到目前为止进展顺利.然而,我刚刚打了我的第一个"说什么?" 时刻.

DataTable提供对其Rows集合的随机行访问,不仅通过典型的集合行为,还通过DataTable.Select.但是,我似乎无法将此功能与DataRow.Delete联系起来.到目前为止,这是我需要做的,以便有条件地从表中删除一行或多行.

int max = someDataTable.Rows.Count - 1;
for(int i = max; i >= 0; --i)
{
    if((int)someDataTable.Rows[i].ItemArray[0] == someValue)
    {
        someDataTable.Rows[i].BeginEdit();
        someDataTable.Rows[i].Delete();
    }
    else
        break;
}
someDataTable.AcceptChanges();

但我对这段代码不满意.我都不相信.我肯定错过了什么.如果我需要有条件地删除一行或多行,我真的被迫按顺序点击Rows集合吗?

(不介意反转.我正在从数据表的末尾删除.所以没关系)



1> Matthew Whit..:

您可以查询数据集,然后循环选定的行以将其设置为删除.

var rows = dt.Select("col1 > 5");
foreach (var row in rows)
    row.Delete();

...你还可以创建一些扩展方法,使其更容易......

myTable.Delete("col1 > 5");

public static DataTable Delete(this DataTable table, string filter)
{
    table.Select(filter).Delete();
    return table;
}
public static void Delete(this IEnumerable rows)
{
    foreach (var row in rows)
        row.Delete();
}


最后,您希望使用以下命令.dt.AcceptChanges()`将这些更改应用于dt表

2> Alain..:

这是一个使用LINQ的单线程,并避免选择字符串的任何运行时评估:

someDataTable.Rows.Cast().Where(
    r => r.ItemArray[0] == someValue).ToList().ForEach(r => r.Delete());


有时候,记得调用函数someDataTable.AcceptChanges(); 删除后

3> itsmatt..:

我没有方便尝试这个窗口框,但我认为您可以使用DataView并执行以下操作:

DataView view = new DataView(ds.Tables["MyTable"]);
view.RowFilter = "MyValue = 42"; // MyValue here is a column name

// Delete these rows.
foreach (DataRowView row in view)
{
  row.Delete();
}

不过,我没有测试过这个.你可以尝试一下.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有