As the error indicates, you can't modify the thing you are enumerating over.
Instead, enumerate over the master list of columns. I called my ref_data
. For every column I found, I asked datatable1
whether it had a column of the same name. If it did, I used the Remove
method against datatable2
to remove the column from the collection.
DataTable ref_data = new DataTable();
DataTable datatable1 = new DataTable();
DataTable datatable2 = new DataTable();
DataTable datatable3 = new DataTable();
ref_data.Columns.Add(new DataColumn("A", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("B", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("C", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("D", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("E", System.Type.GetType("System.Int32")));
ref_data.Columns.Add(new DataColumn("F", System.Type.GetType("System.Int32")));
datatable1.Columns.Add(new DataColumn("A", System.Type.GetType("System.Int32")));
datatable1.Columns.Add(new DataColumn("C", System.Type.GetType("System.Int32")));
datatable1.Columns.Add(new DataColumn("D", System.Type.GetType("System.Int32")));
// Duplicate datatable2 from ref_data
// and then we'll remove what we don't need
datatable2 = ref_data.Clone();
// What columns exist in reference datatable that do not exist in datatable1?
// Linq is probably more elegant but extensions are not working for me
// var column_collection = ref_data.Columns.Where(x => x.)
foreach (DataColumn item in ref_data.Columns)
{
// Build out datatable2 structure
if (datatable1.Columns.Contains(item.ColumnName))
{
datatable2.Columns.Remove(item.ColumnName);
}
}
// At this point, datatable 1 contains ACD, datatable2 contains BEF
Console.WriteLine($"Dumping datatable1");
foreach (DataColumn item in datatable1.Columns)
{
Console.WriteLine(item.ColumnName);
}
Console.WriteLine();
Console.WriteLine($"Dumping datatable2");
foreach (DataColumn item in datatable2.Columns)
{
Console.WriteLine(item.ColumnName);
}