1

私はコードをもっている

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)

しかし、別のループを実行する必要があり、余分なメモリを使用しているため、上記は私には良い方法ではないようです

4

4 に答える 4

0

foreach ループでコレクションを列挙している間は、コレクションからアイテムを削除することはできません。を使用してコレクションのコピーを作成し、コピーに対してCollection.ToArray()foreach を実行して、実際のコレクションからアイテムを削除します。

DataTable.Columns には ToArrayorToListメソッドがないため、このCopyTo()メソッドを使用して、列全体を ColumnsArray にコピーできます。

コピーを作成したくない場合は、foreach ループの代わりに for ループを使用できます。この方法でコードを編集できます。

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

}
于 2015-01-14T02:44:00.790 に答える