【问题标题】:Remove all columns with no data from DataTable从 DataTable 中删除所有没有数据的列
【发布时间】:2009-11-19 22:05:22
【问题描述】:

如果特定列的所有项目都是空的,我想从 DataTable 中删除该列。对 DataTable 中的所有列执行此操作的最优雅的方法是什么?

【问题讨论】:

    标签: c# datatable


    【解决方案1】:

    你可以使用Compute方法,像这样:

    if (table.Compute("COUNT(ColumnName)", "ColumnName <> NULL") == 0)
        table.Columns.Remove("ColumnName");
    

    或者,您可以使用 LINQ:

    if (table.AsEnumerable().All(dr => dr.IsNull("ColumnName")))
        table.Columns.Remove("ColumnName");
    

    编辑:完整回答问题:

    foreach(var column in table.Columns.Cast<DataColumn>().ToArray()) {
        if (table.AsEnumerable().All(dr => dr.IsNull(column)))
            table.Columns.Remove(column);
    }
    

    您需要调用ToArray,因为循环会修改集合。

    【讨论】:

    • 不错。调整代码以检查所有列名,你会得到绿色的复选标记。
    • 也许 ;-)。我实际上已经自己实现了它。只是不想将其标记为正确,因为它没有完全回答最初的问题。
    • 我的数据表有很多行。其中一行包含一个特定的字符串 Like="Container"。我想删除容器字符串的所有上述行,你能显示一些语法吗。
    【解决方案2】:
    private static void RemoveUnusedColumnsAndRows(DataTable table)
        {            
            for (int h = 0; h < table.Rows.Count; h++)
            {
                if (table.Rows[h].IsNull(0) == true)
                {
                    table.Rows[h].Delete();
                }
                enter code here
            }
            table.AcceptChanges();
            foreach (var column in table.Columns.Cast<DataColumn>().ToArray())
            {
                if (table.AsEnumerable().All(dr => dr.IsNull(column)))
                    table.Columns.Remove(column);
            }
            table.AcceptChanges();           
        }
    

    【讨论】:

      【解决方案3】:
      public static void RemoveNullColumnFromDataTable(DataTable dt)
      {
          for (int i = dt.Rows.Count - 1; i >= 0; i--)
          {
              if (dt.Rows[i][1] == DBNull.Value)
                  dt.Rows[i].Delete();
          }
          dt.AcceptChanges();
      }
      

      【讨论】:

      • 如果该行中的第 1 列是 DBNULL,这肯定会删除整行。不完全是 OP 所追求的。
      【解决方案4】:
      Function RemoveEmptyColumns(Datatable As DataTable) As Boolean
          Dim mynetable As DataTable = Datatable.Copy
          Dim counter As Integer = mynetable.Rows.Count
          Dim col As DataColumn
          For Each col In mynetable.Columns
              Dim dr() As DataRow = mynetable.Select(col.ColumnName + " is   Null ")
              If dr.Length = counter Then
                  Datatable.Columns.Remove(col.ColumnName)
                  Datatable.AcceptChanges()
              End If
          return true
      end function
      

      【讨论】:

        【解决方案5】:

        你清除数据表中的所有列。你就这样使用。

        datatable.Columns.Clear();

        【讨论】:

        • 这会清除所有不是用户要求的列。
        猜你喜欢
        • 2018-08-28
        • 2020-02-02
        • 1970-01-01
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多