我参与了一个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集合吗?
(不介意反转。我正在从数据表的末尾删除。所以没关系)
答案 0 :(得分:69)
您可以查询数据集,然后循环选定的行以将其设置为删除。
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();
}
答案 1 :(得分:37)
这是使用LINQ的单线程,并且避免对选择字符串进行任何运行时评估:
someDataTable.Rows.Cast<DataRow>().Where(
r => r.ItemArray[0] == someValue).ToList().ForEach(r => r.Delete());
答案 2 :(得分:8)
我没有方便尝试这个窗口框,但我认为您可以使用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();
}
但是,我没有测试过这个。你可以尝试一下。
答案 3 :(得分:0)
基于Linq的扩展方法
const gulp = require("gulp");
const exec = require('child_process').exec;
let run = false;
gulp.task("watch", () => {
console.log("watching ..");
gulp.watch("**/*.js", ["browserify"]);
});
gulp.task("browserify", () => {
if (run) { return; }
run = true;
console.log("calling browserify");
exec("browserify app.js -o bundle.js");
setTimeout(() => {
run = false;
}, 1000);
});
然后使用:
public static void DeleteRows(this DataTable dt, Func<DataRow, bool> predicate)
{
foreach (var row in dt.Rows.Cast<DataRow>().Where(predicate).ToList())
row.Delete();
}