我有收藏:
public class myList : List<myClass> { }
并做:
foreach (myClass obj in myList) {
//...
if (some_condition) {
myList.Add(newObj); }
//...
}
所以在2次迭代之前,我得到的错误如下:collection was changed
。显然问题出在myList.Add(newObj);
。
如何组织此循环以避免错误?请记住:我可以添加一些元素列表,但永远不会删除。
我可以在迭代器中使用for
循环。但在这种情况下,我的代码看起来会更糟糕。也许这是一个更好的解决方案?
答案 0 :(得分:6)
你可以强制复制集合 - &gt;将在复制的集合上创建一个新的迭代器。 复制集合的最简单方法是扩展方法ToArray(),它从列表中创建一个通用数组。这不会复制对象,只会复制对它们的引用。
foreach(myClass obj in myList.ToArray())
{
...
}
这意味着在发生任何更改之前,您将始终循环遍历集合中的所有项目!没有添加,没有删除。
答案 1 :(得分:0)
您可以使用索引来遍历列表而不是foreach
,然后您可以在遍历时将项目添加到列表中。
例如:
var list = Enumerable.Range(1, 10).ToList(); // 1 , 2, 3, ..., 9, 10
// For each odd number in the list, add that number * 100 to the list.
for (int i = 0, n = list.Count; i < n ; ++i)
{
if ((list[i] & 1) != 0) // Number is Odd?
list.Add(list[i] * 100); // Append 100*number
}
foreach (int n in list)
Console.WriteLine(n);