在遍历数据结构的时候,是不可以修改原数据结构的。不然就会抛出错误。
我常用的解决办法是做一份拷贝,遍历这个拷贝。(如果数据不是很大的话)
比如,这个代码:
IDictionary<int, string> ht = new Dictionary<int, string>(); ht.Add(1, "one"); ht.Add(2, "two"); // Print "one,two" Console.WriteLine(String.Join(",", ht.Values.Select(i => i.ToString()).ToArray())); foreach (int key in new List<int>(ht.Keys)) { if (key == 1) ht.Remove(key); } // Print "two" Console.WriteLine(String.Join(",", ht.Values.Select(i => i.ToString()).ToArray()));
我在遍历的时候,做了一份拷贝。代码是 new List<int>(ht.Keys),用到了 List 的构造拷贝函数,会对 ht.Keys 做一份拷贝。之后的 foreach 其实是在对这个拷贝做遍历。