集合已修改;可能无法执行枚举操作

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

 

 

posted on 2012-08-08 12:44  zg_heng  阅读(19136)  评论(1)    收藏  举报

导航