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

C# 从具有相同行值的数据集中删除列,c#,linq,c#-4.0,datatable,dataset,C#,Linq,C# 4.0,Datatable,Dataset,如果要删除整个列(如果所有值都相同,请使用可枚举),则要使用linq从数据集中删除所有行值等于123的列“value”。所有,例如: ID Name Value ...................... 1 aa 123 2 bb 123 3 cd 123 foreach(ds.Tables中的数据表dt) { 如果(dt.Rows.Count>0&&dt.Columns.Contains(“Value”)&&dt

如果要删除整个列(如果所有值都相同,请使用
可枚举),则要使用linq从数据集中删除所有行值等于123的列“value”。所有
,例如:

ID   Name      Value
 ......................
 1     aa      123
 2     bb      123
 3     cd      123
foreach(ds.Tables中的数据表dt)
{
如果(dt.Rows.Count>0&&dt.Columns.Contains(“Value”)&&dt.Columns[“Value”]。数据类型==typeof(int))
{
int firstValue=dt.行[0]。字段(“值”);
if(dt.AsEnumerable().Skip(1.All)(r=>r.Field(“Value”)==firstValue))
{
dt.列。删除(“值”);
}
}
}

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

然后,您只需概括上述代码:

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(ds.Tables中的数据表dt)
{
List columnsToDelete=新列表();
foreach(dt.列中的数据列列列)
{
对象优先=dt.行[0][col];
if(dt.AsEnumerable().Skip(1).All(r=>r[col].Equals(first)))
{
列删除。添加(列);
}
}
foreach(DataColumn colToRemove in columnsToDelete)
dt.列。移除(colToRemove);
}

此处返回数据行列表

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);
}
ds.Tables[“tableName”].AsEnumerable().Where(g=>g.Field(“Value”)!=123.ToList();

使用SLaks给出的解决方案

foreach(ds.Tables[0].Columns.Cast().ToArray()中的var列)
{
if(ds.Tables[0].AsEnumerable().All(dr=>dr.IsNull(column)))
{
ds.Tables[0]。Columns.Remove(column);
}
}

如果所有值都相同,是否要从表中删除该列?是否要查找和删除该列?如果该列中的所有值都相同,是否要删除该列。但这似乎不是您想要的,是吗?“要查找并删除该列,因为该列中的所有值都相同。”这只是检查数据集的第一个表的第一列是否只包含
123
。因此,如果所有列都是
111
,则不会删除该列。您也没有提到您只需要检查一个表中的一列。下次请更精确地指定您的要求。这将遍历列并检查所有行值是否相同。然后删除该列,但它甚至不会编译,因为
dr[column]
返回
object
,而
123
是一个
int
。您无法将两者与
==
进行比较。
ds.Tables["tableName"].AsEnumerable().Where(g => g.Field<Int32>("Value") != 123).ToList<DataRow>();
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);
            }
        }