Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

collection was modified enumeration operation might not execute

Tags:

c#

asp.net

 string field = ViewState["Field"].ToString();

 DataTable dt = (DataTable)Session["Academic"];
 foreach (DataRow dr in dt.Rows)
 {
      if (dr["Degree"].ToString() == field)
      {
            dr.Delete();
            dt.AcceptChanges();
      }
 }
 Session["Academic"] = dt;
 gdvwAcademic1.DataSource = Session["Academic"] as DataTable;
 gdvwAcademic1.DataBind();

when this code executed raise error as "collection was modified enumeration operation might not execute." why this so..?

like image 962
kls Avatar asked Feb 20 '15 10:02

kls


3 Answers

You cannot modify a collection in a foreach. Try this as an alternative to apomene's answer (Pretty much does the same thing, except using the remove method of a list instead of indexes.

List<DataRow> toDelete = new List<DataRow>();

foreach(DataRow dr in dt.Rows){
    if(dr["Degree"].ToString() == field){
        toDelete.Add(dr);
    }
}

foreach (DataRow dr in toDelete){
    dt.Rows.Remove(dr);
}

This should solve your problem.

like image 93
David Watts Avatar answered Oct 29 '22 08:10

David Watts


You can't modify the collection in a foreach. So don't delete or add things in it.

You could prevent this error by creating a new collection with items you want to modify, for example with LINQ (the ToList() is essential):

var toDelete = dt.AsEnumerable().Where(r => r["Degree"].ToString() == field).ToList();

Now you can loop this without a problem.

foreach(DataRow rowToDelete in toDelete)
    rowToDelete.Delete();
dt.AcceptChanges(); // you could do that also in the loop now
like image 25
Tim Schmelter Avatar answered Oct 29 '22 06:10

Tim Schmelter


you cant delete inside foreach use for loop or make a delete List:

List <int> toBeDel=new List<int>();

  foreach (DataRow dr in dt.Rows)
 {
      if (dr["Degree"].ToString() == field)
      {
            toBEDel.Add(indexOf(dr));
      }
 }

 foreach (int i in toBeDel)
 {
     dt.Rows[i].Delete();
 }
like image 44
apomene Avatar answered Oct 29 '22 07:10

apomene