【问题标题】:Remove datatable row if any column value is empty c#如果任何列值为空,则删除数据表行c#
【发布时间】:2018-08-14 07:33:08
【问题描述】:

即使数据表中的任何列具有空值,我也需要从数据表中删除该行。

例如:

我的数据表有两列

 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();

谁能建议我如何做到这一点?

【问题讨论】:

  • 您面临的问题是什么?
  • 你需要Any 而不是All
  • @RahulAgarwal - 即使行的任何列有空值,我也无法删除该行。

标签: c# asp.net .net linq datatable


【解决方案1】:

试试这个:

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

【讨论】:

  • 纯代码答案并不是特别有用。请添加一些关于此代码如何解决问题的描述。
【解决方案2】:

如果可以使用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();
      }
    }

【讨论】:

    【解决方案3】:

    根据您提到的要求,您需要使用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()))
    

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

    【讨论】:

    • 如果列不是字符串怎么办?
    • 那么我们需要做一些工作来检查确切的类型,或者我们可以通过.ToString()将其转换为字符串
    • @Alexey,null 应该转换为空字符串,然后在 trim() 函数之后检查该字符串的长度是否为零?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多