foreach是取只讀的,在取的時候數據不能變(包括修改,刪除,添加等)。要避免這個問題,就應該使用for循環。
之前沒有考慮過對collection類型對象操作時for 和foreach的區別,總感覺foreach更方便一些。今天寫了個FOREARCH循環來操作刪除某個 collection的元素,出現異常:查詢集合已修改;可能無法執行枚舉操作查了一下,這個是使用foreach的典型的問題。foreach是取只讀的,在取的時候數據不能變(包括修改,刪除,添加等)。要避免這個問題,就應該使用for循環……
在foreach遍歷Dictionary或者hash時,如果刪除元素就會報這個錯。試過遍歷Keys,但刪除元素后還是報一樣的錯。
解決辦法:用一個List把要刪除的Keys記錄了,遍歷完后,把Keys中的元素全刪了
這種情況是由於System.Collection.Generic泛型中集合List<>中執行了Remove()方法,則原有集合將被修改,而foreach的實現依賴於IEnumerable接口或實現GetEnumerator方法,這樣均需要使用List<>實例的length屬性。由於原有集合的長度為不確定因素,此時則將出現無法實現進行枚舉操作的邏輯錯誤。
解決方法是使用for循環進行遍歷刪除,並將游標變量在刪除元素的同時自減1.
for (int i = 0; i < xylist.Count; i++) { double DIST = CoordDispose.getDistance(longitude, latitude, xylist[i].PositionX, xylist[i].PositionY); //如果得到的距離大於設定的距離,則去掉 if (DIST > 500) { xylist.Remove(xylist[i]); i--; //游標也需要跟着-1 } }