C# 如果前4个数据行为空,则删除行
我有一个dataTable,在其中,如果datarow[0]到datarow[3]为空,我希望从dataTable中动态删除该行 我尝试了代码,但不确定如何删除该行:C# 如果前4个数据行为空,则删除行,c#,C#,我有一个dataTable,在其中,如果datarow[0]到datarow[3]为空,我希望从dataTable中动态删除该行 我尝试了代码,但不确定如何删除该行: foreach (DataRow row in myDataSet.Tables[0].Rows) { if ((string.IsNullOrEmpty(row[0].ToString())) && (string.IsNullOrEmpty(row[1].ToString())) && (s
foreach (DataRow row in myDataSet.Tables[0].Rows)
{
if ((string.IsNullOrEmpty(row[0].ToString())) && (string.IsNullOrEmpty(row[1].ToString())) && (string.IsNullOrEmpty(row[2].ToString())) && (string.IsNullOrEmpty(row[3].ToString())))
{
// delete the Row
}
}
myDataSet.Tables[0].AcceptChanges();
如何使用c#?使用-删除行
通常,您无法在foreach
循环中向集合中添加或从集合中删除,但调用row.Delete()
仅标记要删除的行。在调用AcceptChanges
之前,它实际上不会被删除
var dataTable = new DataTable();
dataTable.Columns.Add("One", typeof(string));
dataTable.Columns.Add("Two", typeof(string));
dataTable.Columns.Add("Three", typeof(string));
dataTable.LoadDataRow(new [] { "", "", ""}, true);
dataTable.LoadDataRow(new [] { "NotBlank", "", ""}, true);
dataTable.LoadDataRow(new [] { "", "", "" }, true);
dataTable.LoadDataRow(new [] { "NotBlank", "", "" }, true);
dataTable.LoadDataRow(new [] { "", "", "" }, true);
dataTable.AcceptChanges();
// 5 rows in table.
foreach(DataRow row in dataTable.Rows) {
var values = new[] { row[0], row[1], row[2] };
if(values.All(x => x == null || string.IsNullOrEmpty(x.ToString()))) {
row.Delete();
}
}
// Still 5 rows, 3 marked as deleted
dataTable.AcceptChanges();
// 2 rows in table.
我将使用Linq为您提供符合条件的行的列表,然后从DataTable中删除这些行:
var rows = myDataSet.Tables[0].AsEnumerable()
.Where(r => (string.IsNullOrEmpty(r[0].ToString()))
&& (string.IsNullOrEmpty(r[1].ToString()))
&& (string.IsNullOrEmpty(r[2].ToString()))
&& (string.IsNullOrEmpty(r[3].ToString())))
.ToList();
foreach(DataRow row in rows)
{
myDataSet.Tables[0].Rows.Remove(row);
}
如果没有System.Linq的引用,请记住添加该引用。必须从最后一行向第一行删除。删除第0行时,所有其他行的索引都会减少1。因此,请删除第3、2、1、0行。您不能这样做,因为您将修改正在迭代的集合。事实证明,您可以这样做,因为在调用
AcceptChanges
之前,您实际上不会修改集合。我认为这不管用,但确实管用。很有趣。我认为这就是为什么我们总是使用DataTable.Rows.Remove,因为它是即时的,不需要更改。