我相信不少人對這個再熟悉不過了。對已經修改的集合進行操做就會出現這個錯。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(); }
前不久剛有人遇到,這裏仍是記錄一下吧。泛型