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
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With