集合已修改;可能無法執行枚舉操作。


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
                }               
            }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM