如何以编程方式从 DataTable 中删除 DataColumn

Sim*_*Guy 1 c# collections datatable datacolumncollection datacolumn

我有一个代码

foreach (DataColumn dataTableCol in this.dataTable.Columns)
            {
                bool columnFound = false;
                foreach (GRTColumnView uiColumn in descriptor.UIColumns)
                {
                    if (dataTableCol.ColumnName.Equals(uiColumn.Name))
                    {
                        columnFound = true;
                        break;
                    }
                }

                if (!columnFound)
                {
                    if (this.dataTable.Columns.Contains(dataTableCol.ColumnName))
                        this.dataTable.Columns.Remove(dataTableCol.ColumnName);
                }

            }
Run Code Online (Sandbox Code Playgroud)

如果在另一个集合中找不到某些“东西”,我想从集合中删除它们。

当我运行上面的程序时,我得到

由于集合被修改,迭代可能无法执行

“集合已修改” - 因为删除一定已被命中

那要通过什么方法才能达到这样的效果呢?

我能想到的是记下所有要删除的“东西”,然后

foreach( aThing in all_things_to_remove)
     remove_from_collection(aThing)
Run Code Online (Sandbox Code Playgroud)

但上面对我来说似乎不是一个好方法,因为我必须进行另一个循环并且正在使用额外的内存

Gra*_*ICA 5

在这种特定情况下,当您循环遍历包含几列的小集合时,您只需创建一个新集合(通过ToList()),这样您就不会迭代您正在修改的同一集合:

foreach (var dataTableCol in dataTable.Columns.Cast<DataColumn>().ToList())
{
    ...

    dataTable.Columns.Remove(dataTableCol.ColumnName);
}
Run Code Online (Sandbox Code Playgroud)

推荐的方法,特别是当集合很大时,是向后枚举:

for (var i = dataTable.Columns.Count - 1; i >= 0; i--)
{
    ...

    dataTable.Columns.Remove(dataTable.Columns[i].ColumnName);
}
Run Code Online (Sandbox Code Playgroud)