DataTable,如何有条件地删除行

我参与了C#的学习过程,目前进展顺利。 不过我刚刚打了我的第一个“说什么?” 时刻。

DataTable提供了随机行访问它的行集合,不仅通过典型的集合行为,而且通过DataTable.Select。 不过,我似乎无法将此function绑定到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集合?

(不要介意倒过来,我从数据表的尾部删除,所以没关系)

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

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

…你也可以创build一些扩展方法,使其更容易…

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

这是一个使用LINQ的单线程,避免了对selectstring的任何运行时评估:

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

我没有一个方便的窗口框来尝试这个,但我认为你可以使用一个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(); } 

虽然我没有testing过。 你可以试试看。

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