foreach是取只讀的,在取的時候數據不能變(包括修改,刪除,添加等)。要避免這個問題,就應該使用for循環。
以前沒有考慮過對collection類型對象操作時for 和foreach的區別,總感覺foreach更方便一些。今天寫了個foreach循環來遍歷一個list,之后在foreach體內又對其添加,表面上邏輯和寫法看着沒錯,但在運行時出現異常:查詢集合已修改;可能無法執行枚舉操作。查了一下,這個是使用foreach的典型的問題。
附錯誤demo代碼:
try { List<string> lsts = new List<string>(); lsts.Add("1"); lsts.Add("2"); lsts.Add("3"); lsts.Add("4"); lsts.Add("2"); lsts.Add("6"); lsts.Add("1"); lsts.Add("8"); lsts.Add("9"); lsts.Add("10"); int count = 0; int countreus = 0; List<string> lstresult = new List<string>(); foreach (string a in lsts) { count++; if (count == 1) { lstresult.Add(a); } else { if (count == lsts.Count) { count = 0; } else { foreach (string b in lstresult) { countreus++; if (b.Contains(a.Trim())) { break; } else { if (countreus == lstresult.Count) { lstresult.Add(a); } } } } } } } catch (Exception ex) { throw; }
最后拋出異常:集合已修改;可能無法執行枚舉操作。
正確代碼如下:
try { List<string> lsts = new List<string>(); lsts.Add("1"); lsts.Add("2"); lsts.Add("3"); lsts.Add("4"); lsts.Add("2"); lsts.Add("6"); lsts.Add("1"); lsts.Add("8"); lsts.Add("9"); lsts.Add("10"); int count = 0; int countreus = 0; List<string> lstresult = new List<string>(); foreach (string a in lsts) { count++; if (count == 1) { lstresult.Add(a); } else { if (count == lsts.Count) { count = 0; } else { for (int i = 0; i < lstresult.Count; i++) { countreus++; if (lstresult[i].Contains(a.Trim())) { break; } else { if (countreus == lstresult.Count) { lstresult.Add(a); } } } } } } } catch (Exception ex) { throw; }