C# 如果前4个数据行为空,则删除行

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

我有一个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())) && (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,因为它是即时的,不需要更改。