Possible Duplicate:
Collection was modified; enumeration operation may not executeC#集合已被修改;枚舉操作可能不會執行
您好,
我建立一個項目評估程序,並正在以下錯誤:C#集合已修改;枚舉操作可能不會執行。我initally這個全球聲明diciontary :
它關係到使用該
Dictionary<int, int> rankings = new Dictionary<int, int>();
含本詞典下一個方法執行以下操作:
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();
}
我把它稱爲一個第二次在這裏:
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();
}
}
問題出現在此處代碼的區域:
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();
}
}
與問題所在將非常感激
btw,脫離主題,你的MySqlConnection和MySqlDataReader類不會實現IDisposable到Dispose()方法,這樣你就可以使用block來連接和閱讀器了嗎? – 2011-05-30 14:49:40
@ydobonmai:'MySqlConnection'和'MySqlDataReader'可能是指用於處理MySQL數據庫的'MySql.Data.MySqlClient'類。因此,他們確實實現了'IDisposable',並且他們的使用應該被封裝在'使用'塊中。 – jason 2011-05-30 15:04:34