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

How to use foreach if iterating collection is changed in this loop?

我有 collection:

public class myList : List<myClass> { }

然后做:

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

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

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

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

您可以强制复制集合 --> 将在复制的集合上创建一个新的迭代器。 复制集合的最简单方法是扩展方法 ToArray(),它从列表中创建一个通用数组。这不会复制对象,只会复制对它们的引用。

foreach(myClass obj in myList.ToArray())
{
      ...
}

这意味着在发生任何更改之前,您将始终遍历集合中的所有项目!没有添加,没有删除。

您可以使用索引而不是 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);