.net 将节点添加到LinkedList<;T>;弗雷奇

.net 将节点添加到LinkedList<;T>;弗雷奇,.net,foreach,linked-list,.net,Foreach,Linked List,我可以安全地将节点添加到foreach语句中的LinkedList容器中吗?如果我使用while循环,有什么区别吗?或者,这是不允许的,可能会导致一些问题 foreach(var node in myList) { if(condition) myList.AddLast(new MyNode()); } 它会一直工作吗?当使用foreach语句对集合进行迭代时,您不能修改它。因此,添加项将导致编译器错误。在对集合进行枚举时,不能修改集合 从: 只要 收藏保持不变。如果

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

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

它会一直工作吗?

当使用
foreach
语句对集合进行迭代时,您不能修改它。因此,添加项将导致编译器错误。

在对集合进行枚举时,不能修改集合

从:

只要 收藏保持不变。如果 对集合进行了更改, 例如添加、修改或删除 元素,枚举数为 不可恢复的无效及其后果 行为是未定义的

实际上,我相信它总是会抛出一个
invalidoOperationException
,尽管行为还没有正式定义

编辑:您在评论中询问
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;
}
LinkedListNode current=myList.First;
while(当前!=null)
{
if(condition)//使用current.Value获取值
{
AddLast(新的MyNode());
}
当前=当前。下一步;
}
据我所知,这是完全安全和可预测的。您始终可以向一个节点请求其下一个节点。如果您碰巧正在查看尾部节点并添加另一个尾部节点,那么当您请求“下一步”时,您将得到新的尾部节点


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

否,枚举器对象会记住所属集合的内部版本。集合修改后-版本更改,因此foreach将失败。

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

您可以使用
while
循环来循环集合。执行此操作时,您不会收到编译器错误,但请注意不要编写无限循环-如果new
MyNode()
满足
条件,则可能会发生无限循环。这不会导致编译器错误。给出的代码编译起来不会有问题。它将在执行时抛出一个异常。@Jon Skeet:Oops-我刚刚想起Visual Studio对这段代码的抱怨,并认为这将是一个编译器错误。。。谢谢+1使用reflector查看枚举数是如何执行检查的:)如果新节点符合条件,则完全安全是一个拉伸的、无止境的循环和OOM。