linq 如果任何列值为空,则删除数据表行c#

vnzz0bqm  于 2022-12-06  发布在  C#
关注(0)|答案(4)|浏览(169)

我需要从datatable中删除该行,即使datatable中的任何列都有空值。
例如:
我的数据表有两列

Value     Input
  Dep     Phase 1
  Sec     
  Div     Phase 2

测试结果

Value     Input
  Dep     Phase 1
  Div     Phase 2

我想删除第二行,因为输入列有空值。我被下面的代码卡住了。

dtTable = dtTable.Rows.Cast<DataRow>()
          .Where(row => !row.ItemArray.All(field => field is DBNull || string.IsNullOrWhiteSpace(field as string))).
          .CopyToDataTable();

谁能告诉我如何才能做到这一点?

iih3973s

iih3973s1#

根据您提到的要求,您需要使用Any,它将检查是否至少有一列具有null值或空字符串,它将过滤掉该行。因此,执行如下操作:

row => !row.ItemArray.Any(field => field is DBNull || 
                                string.IsNullOrWhiteSpace(field as string))

编辑:

如果您的所有列都是string类型,则上面的代码可以正常工作,否则您需要通过调用ToString()将其显式转换为字符串:

row => !row.ItemArray.Any(field => field is DBNull || 
                                string.IsNullOrWhiteSpace(field.ToString()))

这将只返回那些每列都有值的行。

tpgth1q7

tpgth1q72#

可以使用If for循环。我们可以检查每一行和每一列的空值

for (int i = dt.Rows.Count - 1; i >= 0; i--)
    {

      if (dt.Rows[i]["col1"] == DBNull.Value || dt.Rows[i]["col2"] == DBNull.Value)
      {
           dt.Rows[i].Delete();
      }
    }
s5a0g9ez

s5a0g9ez3#

试试这个:

for (int i = dt.Rows.Count - 1; i >= 0; i--)
    {
    if (dt.Rows[i]["Column2"].ToString() == "")
        {
            dt.Rows[i].Delete();
            dt.AcceptChanges();
        }
    }
amrnrhlw

amrnrhlw4#

for (int i = dt.Rows.Count - 1; i >= 0; i--)
                {
                    if (dt.Rows[i][1] == DBNull.Value)
                    {
                        dt.Rows[i].Delete();
                    }
                }
                dt.AcceptChanges();

它删除数据表中空行

相关问题