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

C# 如何以编程方式从DataTable中删除DataColumn,c#,collections,datatable,datacolumn,datacolumncollection,C#,Collections,Datatable,Datacolumn,Datacolumncollection,我有密码 foreach (DataColumn dataTableCol in this.dataTable.Columns) { bool columnFound = false; foreach (GRTColumnView uiColumn in descriptor.UIColumns) { if (dataTableCol.C

我有密码

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

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

当我运行上述程序时,我得到

当集合被修改时,可能无法执行迭代

“集合已修改”-因为删除必须已命中

那么,实现这一目标的方法是什么?

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

foreach( aThing in all_things_to_remove)
     remove_from_collection(aThing)

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

在使用foreach循环枚举集合时,无法从集合中删除项。使用
collection.ToArray()
制作收藏的副本,并在副本上运行foreach,然后从实际收藏中删除您的项目

由于DataTable.Columns没有
ToArray
ToList
方法,因此可以使用
CopyTo()
方法将整个列复制到ColumnsArray

如果不想创建副本,则可以使用for循环而不是foreach循环。您可以通过以下方式编辑代码:

for (int i = 0; i < dataTable.Columns.Count; i++)
{
    bool columnFound = false;
    foreach (GRTColumnView uiColumn in descriptor.UIColumns)
    {
        if (dataTable.Columns[i].Name.Equals(uiColumn.Name))
        {
            columnFound = true;
            break;
        }
    }

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

}
for(int i=0;i
在这种特定情况下,当您在一个包含几列的小集合中循环时,您只需创建一个新集合(通过
ToList()
),这样您就不会对正在修改的同一集合进行迭代:

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

    dataTable.Columns.Remove(dataTableCol.ColumnName);
}

另一种方法是删除列后降低索引

for (int i = 0; i < datatable.Columns.Count; i++)
            {
                if (datatable.Columns[i].ColumnName.Contains("Column"))
                {
                    datatable.Columns.RemoveAt(i);
                    i--;
                }
            }
for(int i=0;i
@puropoix像这样吗
for(inedx=this.dataTable.Columns.Count-1;index>=0;index++)或者有更好的方法吗?我从错误中知道了这一点。我在问一条出路。按照你的建议,我已经在我的问题中指出了类似的方法,这对我的回答听起来并不好。在我的情况下,正如你所说的,我的藏品很小,但如果我的藏品很大呢?有没有办法避免抄袭?
for (int i = 0; i < datatable.Columns.Count; i++)
            {
                if (datatable.Columns[i].ColumnName.Contains("Column"))
                {
                    datatable.Columns.RemoveAt(i);
                    i--;
                }
            }
if (dt.Columns.Contains("RecordID")){
                    dt.Columns.Remove("RecordID");
                    dt.AcceptChanges();
                }