[C#]集合已修改;可能沒法執行枚舉操做

摘要

我相信不少人對這個再熟悉不過了。對已經修改的集合進行操做就會出現這個錯。spa

解決辦法

好比有下面的一段代碼,咱們建立一個集合,並向集合中添加10個數,而後,咱們循環再將這些數移除了。code

        static void Main(string[] args)
        {
            List<int> lst = new List<int>();
            for (int i = 0; i < 10; i++)
            {
                lst.Add(i);
            }
            foreach (var item in lst)
            {
                lst.Remove(item);
            }
            Console.Read();
        }

出現了.....blog

是否是被泛型集合提供的方法坑了?我記得好久以前我也被坑過。很疑惑吧,其實也很簡單,由於你若是移除了一項,集合的元素個數是變化的。這個時候元素會重排,第二個元素的索引由1變爲0,後面的依次往前移動。索引

        static void Main(string[] args)
        {
            List<int> lst = new List<int>();
            for (int i = 0; i < 10; i++)
            {
                lst.Add(i);
            }
            var result = lst;
            Console.WriteLine("lst的count" + lst.Count);
            lst.Remove(0);
            Console.WriteLine("lst的count" + lst.Count);
            for (int i = 0; i < lst.Count; i++)
            {
                Console.WriteLine("索引:{0},值:{1}", i, lst[i]);
            }
            Console.Read();
        }

上面的代碼爲集合添加10個元素。而後輸出當前集合的count,接着將索引爲0的元素移除。這個時候集合中應該沒有元素0了。而後輸出集合的元素個數。輸出此時的集合中索引和對應的值。如圖所示string

能夠看到,原本索引爲1的1,往前移動了,此時他的索引變爲了0.因此在使用foreach移除的時候,集合是變化的,是不容許的。難道就沒辦法操做了嗎?固然有,它不是移除一個集合就少一個嗎》it

此時,咱們能夠經過for循環,從集合的隊尾移除,這個時候移除隊尾的元素,雖然集合的count變了,但他們的索引沒有變化。for循環

       static void Main(string[] args)
        {
            List<int> lst = new List<int>();
            for (int i = 0; i < 10; i++)
            {
                lst.Add(i);
            }
            var result = lst;
            Console.WriteLine("lst的count" + lst.Count);
            lst.Remove(0);
            Console.WriteLine("lst的count" + lst.Count);
            for (int i = lst.Count - 1; i >= 0; i--)
            {
                Console.WriteLine("索引:{0},值:{1}", i, lst[i]);
                Console.WriteLine("移除了元素:{0}", lst[i]);
                lst.RemoveAt(i);
            }
            Console.Read();
        }

那麼咱們只移除知足條件的是否也能夠經過for循環呢?固然能夠,foreach你不是不讓嗎?又不是隻有你一個能夠循環。class

        static void Main(string[] args)
        {
            List<int> lst = new List<int>();
            for (int i = 0; i < 10; i++)
            {
                lst.Add(i);
            }
            var result = lst;
            Console.WriteLine("lst的count" + lst.Count);
            lst.Remove(0);
            Console.WriteLine("lst的count" + lst.Count);
            for (int i = 0; i < lst.Count; i++)
            {
                Console.WriteLine("索引:{0},值:{1}", i, lst[i]);
                if (lst[i] % 2 == 0)
                {
                    Console.WriteLine("移除了元素:{0}", lst[i]);
                    lst.RemoveAt(i);
                }

            }
            Console.Read();
        }

總結

前不久剛有人遇到,這裏仍是記錄一下吧。泛型

相關文章
相關標籤/搜索