Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Collection was modified; enumeration operation may not execute [duplicate]

Possible Duplicate:
Collection was modified; enumeration operation may not execute

HI there,

I am create an project estimation program and am getting the following error: C# Collection was modified; enumeration operation may not execute.

It is related to using this: I initally declare the diciontary globally with this:

Dictionary<int, int> rankings = new Dictionary<int, int>(); 

The Next Method containing this dictionary does the following:

private void getFirstEstimation() {     List<int> array = new List<int>();      string strConnection = ConfigurationSettings.AppSettings["ConnectionString"];     MySqlConnection connection = new MySqlConnection(strConnection);     MySqlCommand command = connection.CreateCommand();     MySqlDataReader reader;     command.CommandText = "SELECT idprojects FROM `test`.`projects` WHERE application_layers = " + applicationTiers;     connection.Open();      reader = command.ExecuteReader();     while (reader.Read())     {         array.Add(Convert.ToInt32(reader["idprojects"].ToString()));     }     foreach (int i in array)     {         rankings[i] = 15;     }     connection.Close(); } 

I call it for a second time here:

private void getSecondEstimation() {     Dictionary<int, string> sqltext = new Dictionary<int, string>();     Dictionary<int, int> valueForSql = new Dictionary<int, int>();     Dictionary<int, int> weightings = new Dictionary<int, int>();     sqltext.Add(1, "project_type");     valueForSql.Add(1, projectType);     weightings.Add(1, 10);     sqltext.Add(2, "application_domain");     valueForSql.Add(2, applicationDomain);     weightings.Add(2, 8);     sqltext.Add(3, "organisation_size");     valueForSql.Add(3, organizationSize);     weightings.Add(3, 8);     sqltext.Add(4, "no_of_locations");     valueForSql.Add(4, noOfLocations);     weightings.Add(4, 7);     sqltext.Add(5, "development_process");     valueForSql.Add(5, developmentProcess);     weightings.Add(5, 6);     sqltext.Add(6, "rules_engine");     valueForSql.Add(6, rulesEngine);     weightings.Add(6, 5);     sqltext.Add(7, "middleware");     valueForSql.Add(7, middleware);     weightings.Add(7, 4);     sqltext.Add(8, "location_of_development");     valueForSql.Add(8, locationOfDevelopment);     weightings.Add(8, 3);     sqltext.Add(9, "programming_language");     valueForSql.Add(9, programmingLanguage);     weightings.Add(9, 3);     sqltext.Add(10, "development_environment");     valueForSql.Add(10, developmentEnvironment);     weightings.Add(10, 3);     sqltext.Add(11, "backend");     valueForSql.Add(11, backend);     weightings.Add(11, 3);     sqltext.Add(12, "webserver");     valueForSql.Add(12, webServer);     weightings.Add(12, 3);      List<int> array = new List<int>();      string strConnection = ConfigurationSettings.AppSettings["ConnectionString"];     MySqlConnection connection = new MySqlConnection(strConnection);     MySqlCommand command = connection.CreateCommand();     MySqlDataReader reader;      for (int i = 1; i <= 12; i++)     {         command.CommandText = "SELECT idprojects FROM `test`.`projects` WHERE " + sqltext[i] + " = " + valueForSql[i];         connection.Open();         //int testInt;         reader = command.ExecuteReader();         while (reader.Read())         {             array.Add(Convert.ToInt32(reader["idprojects"].ToString()));         }         foreach (int a in array)         {             if (!rankings.ContainsKey(a))             {                 rankings[a] = 0;             }             rankings[a] = rankings[a] + weightings[i];         }         connection.Close();     }        } 

The problem arises at this area of the code:

private void getThirdEstimation() {     ArrayList tempModuleHolder;      string strConnection = ConfigurationSettings.AppSettings["ConnectionString"];     MySqlConnection connection = new MySqlConnection(strConnection);     MySqlCommand command = connection.CreateCommand();     MySqlDataReader reader;     int similarModules;      foreach (KeyValuePair<int, int> kvp in rankings)     {         similarModules = 0;         tempModuleHolder = new ArrayList();         command.CommandText = "SELECT id_modules FROM `test`.`modules_in_project` WHERE id_project = " + kvp.Key;         connection.Open();          reader = command.ExecuteReader();         while (reader.Read())         {             tempModuleHolder.Add(Convert.ToInt32(reader["id_modules"].ToString()));         }          foreach (int i in tempModuleHolder)         {             if(modules.Contains(i))             {                 similarModules++;             }         }         if((double)(similarModules/modules.Count)>0.6)         {             //kvp.Value = kvp.Value + 4;             rankings[kvp.Key] = rankings[kvp.Key] + 4;         }         connection.Close();     } } 

Any help with where the problem lies will be much appreciated

like image 764
GreeneScreen Avatar asked May 30 '11 14:05

GreeneScreen


2 Answers

Any collection that you iterate over with foreach may not be modified during iteration.

So while you're running a foreach over rankings, you cannot modify its elements, add new ones or delete any.

like image 154
Roy Dictus Avatar answered Sep 24 '22 01:09

Roy Dictus


The error tells you EXACTLY what the problem is (and running in the debugger or reading the stack trace will tell you exactly where the problem is):

C# Collection was modified; enumeration operation may not execute.

Your problem is the loop

foreach (KeyValuePair<int, int> kvp in rankings) {     // } 

wherein you modify the collection rankings. In particular, the offensive line is

rankings[kvp.Key] = rankings[kvp.Key] + 4; 

Before you enter the loop, add the following line:

var listOfRankingsToModify = new List<int>(); 

Replace the offending line with

listOfRankingsToModify.Add(kvp.Key); 

and after you exit the loop

foreach(var key in listOfRankingsToModify) {     rankings[key] = rankings[key] + 4; } 

That is, record what changes you need to make, and make them without iterating over the collection that you need to modify.

like image 34
jason Avatar answered Sep 24 '22 01:09

jason