【问题标题】:Remove Column from Dataset having same row values从具有相同行值的数据集中删除列
【发布时间】:2014-12-15 11:51:48
【问题描述】:
ID   Name      Value
 ......................
 1     aa      123
 2     bb      123
 3     cd      123

想要使用 linq 从数据集中删除所有行值等于 123 的列“值”

【问题讨论】:

标签: c# linq c#-4.0 datatable dataset


【解决方案1】:

如果您想在所有值相同的情况下删除整列,请使用Enumerable.All,例如:

foreach(DataTable dt in ds.Tables)
{
   if(dt.Rows.Count > 0 && dt.Columns.Contains("Value") && dt.Columns["Value"].DataType == typeof(int))
   {
       int firstValue = dt.Rows[0].Field<int>("Value");
       if(dt.AsEnumerable().Skip(1).All(r => r.Field<int>("Value") == firstValue))
       {
           dt.Columns.Remove("Value");
       }
   }
}

更新“想要查找并删除该列,但该列中的所有值都相同。

那么你只需要概括上面的代码:

foreach (DataTable dt in ds.Tables)
{
    List<DataColumn> columnsToDelete = new List<DataColumn>();
    foreach (DataColumn col in dt.Columns)
    {
        object first = dt.Rows[0][col];
        if (dt.AsEnumerable().Skip(1).All(r => r[col].Equals(first)))
        {
            columnsToDelete.Add(col);
        }
    }
    foreach (DataColumn colToRemove in columnsToDelete)
        dt.Columns.Remove(colToRemove);
}

【讨论】:

    【解决方案2】:

    这里返回数据行列表

    ds.Tables["tableName"].AsEnumerable().Where(g => g.Field<Int32>("Value") != 123).ToList<DataRow>();
    

    【讨论】:

      【解决方案3】:

      使用 SLaks https://stackoverflow.com/a/1766950/848286 给出的解决方案

      foreach (var column in ds.Tables[0].Columns.Cast<DataColumn>().ToArray())
              {
                  if (ds.Tables[0].AsEnumerable().All(dr => dr.IsNull(column)))
                  {
                      ds.Tables[0].Columns.Remove(column);
                  }
              }
      

      【讨论】:

      • 但它似乎没有做你想做的事,是吗? “如果该列中的所有值都相同,则要查找并删除该列。” 这只是检查数据集的第一个表的第一列是否仅包含123。因此,如果都是111,则不会删除该列。你也没有提到你只检查一个表的单个列。请下次更准确地说明您的要求。
      • 这会遍历列并检查所有行值是否相同。然后删除该列
      • 但它甚至无法编译,因为dr[column] 返回object123int。您无法将两者与== 进行比较。
      猜你喜欢
      • 2012-01-13
      • 1970-01-01
      • 2013-03-17
      • 2011-03-18
      • 1970-01-01
      • 2017-11-07
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多