数据表,如何有条件地删除行(DataTable, How to conditionally dele

2019-08-21 04:16发布

我从事C#的学习过程,它进展顺利,到目前为止。 然而,我刚才打我的第一次“说什么?” 时刻。

该数据表提供给它的行集合,不仅通过典型的集合行为,还可以通过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();

但我不是很满意这个代码。 无论是我相信。 我肯定错过了什么。 我真的不得不如果我需要有条件地删除一个或多个行打行集合顺序?

(不介意倒置。我是从数据表的末尾删除。所以没关系)

Answer 1:

你可以查询数据集,然后循环选定行将它们设置为删除。

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<DataRow> rows)
{
    foreach (var row in rows)
        row.Delete();
}


Answer 2:

下面是使用LINQ,避免选择字符串中的任何运行时间评估一个班轮:

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


Answer 3:

我没有Windows中方便的尝试,但我认为你可以使用一个数据视图,做一些像这样:

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();
}

我没有测试过这一点,虽然。 你可以试试看。



Answer 4:

基于LINQ的扩展方法

public static void DeleteRows(this DataTable dt, Func<DataRow, bool> predicate)
{
    foreach (var row in dt.Rows.Cast<DataRow>().Where(predicate).ToList())
        row.Delete();
}

然后使用:

DataTable dt = GetSomeData();
dt.DeleteRows(r => r.Field<double>("Amount") > 123.12 && r.Field<string>("ABC") == "XYZ");


文章来源: DataTable, How to conditionally delete rows