从DataTable中删除空列

时间:2017-06-23 14:38:48

标签: c# .net collections datatable

我想从DataTable中删除所有空列。我创建了一个包含空行的所有列的列表,然后删除它们。

由于System.InvalidOperationException,它无法正常工作。异常声称我尝试编辑我列举的集合,这是我不理解的,因为我认为我复制了该集合。

private DataTable data;

public void removeEmptyColoums()
{
// Get all empty coloums
  IEnumerable<DataColumn> queriableColumms = data.Columns.Cast<DataColumn>().AsQueryable();
  var toBeRemoved = from DataColumn column in queriableColumms
                    where data.AsEnumerable().All(row => row.IsNull(column))
                    select column;
  // Delete them
  foreach(DataColumn column in toBeRemoved)  // Exception thrown here
  {
    data.Columns.Remove(column);
  }
}

我不确定。 AsQueryable.Cast也可以调用。

1 个答案:

答案 0 :(得分:1)

我的谦虚猜测:

只要列表尚未最终确定(例如ToList()),您确实正在处理它,并且从未实际制作副本。

IEnumerable<DataColumn> queriableColumms = data.Columns.Cast<DataColumn>().AsQueryable();

我们在此处看到您使用data生成Queryable,而非独立列表。

var toBeRemoved = from DataColumn column in queriableColumms
                where data.AsEnumerable().All(row => row.IsNull(column))
                select column;

此处,您还在使用LinqToSQL,而不是最终确定列表。

因此,当您致电toBeRemoved时,您会调用查询的结果,因此仍在使用原始来源data

尝试使用toBeRemoved.ToList(),然后对其进行循环。

实际上,我认为这个问题可能存在于其他地方,因为你说当你在toBeRemoved开始循环时发生异常,而不是在你真正尝试删除某个项目的情况下,但我会在以后编辑这个解决方案不起作用。