从具有相同行值的数据集中删除列

时间:2014-10-20 13:16:32

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

ID   Name      Value
 ......................
 1     aa      123
 2     bb      123
 3     cd      123

想要删除列"值"它使用linq

从Dataset获得所有行值等于123

3 个答案:

答案 0 :(得分: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");
       }
   }
}

更新&#34;想要找到并删除该列,该列中的所有值都相同。&#34;

然后你只需要概括上面的代码:

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

答案 1 :(得分:0)

此处返回datarow列表

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

答案 2 :(得分:0)

使用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);
            }
        }