我从事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();
但我不是很满意这个代码。 无论是我相信。 我肯定错过了什么。 我真的不得不如果我需要有条件地删除一个或多个行打行集合顺序?
(不介意倒置。我是从数据表的末尾删除。所以没关系)
你可以查询数据集,然后循环选定行将它们设置为删除。
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();
}
下面是使用LINQ,避免选择字符串中的任何运行时间评估一个班轮:
someDataTable.Rows.Cast<DataRow>().Where(
r => r.ItemArray[0] == someValue).ToList().ForEach(r => r.Delete());
我没有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();
}
我没有测试过这一点,虽然。 你可以试试看。
基于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");