C# DataTable,如何有条件地删除行

C# DataTable,如何有条件地删除行,c#,datatable,delete-row,C#,Datatable,Delete Row,我参与了一个C语言学习过程,到目前为止进展顺利。我不过刚刚打了我的第一个说什么?片刻 DataTable提供对其Rows集合的随机行访问,不仅通过典型的集合行为,而且通过DataTable.Select。但是,我似乎无法将此功能与DataRow.Delete联系起来。到目前为止,为了有条件地从表中删除一行或多行,我似乎需要这样做 int max = someDataTable.Rows.Count - 1; for(int i = max; i >= 0; --i) { if((i

我参与了一个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集合


不要介意倒装。我正在从数据表的末尾删除。所以没关系

您可以查询数据集,然后循环所选行以将其设置为delete

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

我手边没有windows box来尝试此功能,但我认为您可以使用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();
}

不过,我还没有测试过这个。您可以试一试。

这里有一个使用LINQ的单行程序,避免对所选字符串进行任何运行时计算:

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

基于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");

啊!!我没有想到Select将返回对datatable行的引用。我知道我肯定错过了什么。非常感谢!太好的解决方案,这也解决了我的datatable问题。选择更改顺序。最后,您希望使用下面的命令将这些更改应用于dt table。dt.AcceptChanges我尝试了,并且成功了。不过,我更喜欢选择方法。但要记住一件好事。谢谢:+1我真的很喜欢这个解决方案-非常好-谢谢!有时,记住调用函数someDataTable.AcceptChanges;之后delete@GreyWolf如果要将更改写回数据库,则不要调用AcceptChanges!AcceptChanges会将所有新的/更新的行标记为未更改,因此DataAdapter会认为没有更改,并且不会在.Update上向数据库写入任何内容。在这种情况下,r.ItemArray[0]是什么?它是行的第一列吗?当你回复时请给我贴上标签。这是一个非常漂亮和优雅的代码。两天以来我一直在寻找这个把戏!非常感谢@Alain发布此代码,因为你救了我一天。