如果在此循环中更改迭代集合,如何使用foreach?

时间:2015-03-17 13:12:21

标签: c# foreach

我有收藏:

public class myList : List<myClass> { }

并做:

foreach (myClass obj in myList) {
    //...
    if (some_condition) {
        myList.Add(newObj); }
    //...
}

所以在2次迭代之前,我得到的错误如下:collection was changed。显然问题出在myList.Add(newObj);

如何组织此循环以避免错误?请记住:我可以添加一些元素列表,但永远不会删除。

我可以在迭代器中使用for循环。但在这种情况下,我的代码看起来会更糟糕。也许这是一个更好的解决方案?

2 个答案:

答案 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);