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


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

 

 


免責聲明!

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



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