我想从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
也可以调用。
答案 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
开始循环时发生异常,而不是在你真正尝试删除某个项目的情况下,但我会在以后编辑这个解决方案不起作用。