将节点添加到foreach中的LinkedList <t> </t>

时间:2010-08-08 19:23:10

标签: .net foreach linked-list

我可以安全地将节点添加到foreach语句中的LinkedList容器吗?如果我使用while循环有什么区别吗?或者它永远不被允许并且可能导致一些问题?

foreach(var node in myList)
{
    if(condition)
        myList.AddLast(new MyNode());
}

总是会工作吗?

4 个答案:

答案 0 :(得分:6)

您在枚举时无法修改集合。

来自docs for LinkedList<T>.GetEnumerator

  

只要枚举器仍然有效   该系列保持不变。如果   对集合进行了更改,   例如添加,修改或删除   元素,枚举器是   不可恢复的无效及其   行为未定义。

在实践中,我相信它总会抛出InvalidOperationException,尽管行为正式未定义。

编辑:您在评论中询问while循环是否有帮助...使用GetEnumerator / MoveNext / Current的while循环不会,但是将:

LinkedListNode<MyNode> current = myList.First;
while (current != null)
{
    if (condition) // use current.Value to get the value
    {
        myList.AddLast(new MyNode());
    }
    current = current.Next;
}

据我所知,这是完全安全和可预测的。您始终可以向节点询问其下一个节点。如果您正在查看尾节点并添加另一个节点,那么当您要求“下一个”时,您将获得新的尾节点。

如果这没有帮助,请向我们提供有关您要实现的目标的更多详细信息。

答案 1 :(得分:2)

不,枚举器对象会记住拥有集合的内部版本。收集修改后 - 版本已更改,因此foreach将失败。

答案 2 :(得分:1)

在使用foreach语句迭代集合时,您无法修改它。因此,添加项将导致编译器错误。

答案 3 :(得分:0)

也许您可以将它们添加到新列表中。最后,在 foreach 之外使用 .addrange()将新的附加到原始列表中。