Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error in datarow,Collection was modified; enumeration operation might not execute [duplicate]

I have for-each loop in which the data row is updated so the exception ,Collection was modified; enumeration operation might not execute is generated. any way to fix it? i have seen To-List function but it is not working with data row , here is my code:

foreach (DataRow row in dataTable.Rows) {
  temp = row[0].ToString();
  foreach (DataRow rows in dataTable.Rows) {
    if (temp == rows[0].ToString()) {
      tempdatatable.Rows.Add(row[0],row[1]);
      dataTable.Rows.Remove(rows);
      //Update happens here
    }
    tempdatatable.DefaultView.Sort = "gscitations DESC";
    dataGridView1.DataSource = tempdatatable;
  }
}
like image 248
mani Avatar asked Mar 17 '13 04:03

mani


1 Answers

You cannot modify collection while enumerating it using Enumerator, which is happening behind the scene of the foreach statement (MDSN link).

One possible way to solve this problem is to collect rows to be deleted in the first enumeration and than remove them in the separate loop like this:

var rowsToDelete = new List<DataRow>();

foreach (DataRow row in dataTable.Rows)
     {
         temp = row[0].ToString();
         foreach (DataRow rows in dataTable.Rows)
         {
             if (temp == rows[0].ToString())
             {
                 tempdatatable.Rows.Add(row[0],row[1]);
                 rowsToDelete.Add(rows);
             }
             tempdatatable.DefaultView.Sort = "gscitations DESC";
             dataGridView1.DataSource = tempdatatable;
         }
     }

rowsToDelete.ForEach( x => dataTable.Rows.Remove(x) );

You can also replace foreach loop with for, but you need to do extra work properly handling the current index while deleting the elements.

like image 200
koss Avatar answered Sep 28 '22 02:09

koss