Can I safely add nodes to LinkedList container inside foreach statement? Is there any difference if I used while loop? Or it is never allowed and can cause some problems?
foreach(var node in myList)
{
if(condition)
myList.AddLast(new MyNode());
}
Will it always work?
T. Specifies the element type of the linked list.
Inserting a new node at the end of the Linked List is very easy. First, a new node with given element is created. It is then added at the end of the list by linking the last node to the new node. The function push_back is created for this purpose.
Inserting Items at the End The following function is used to add an item at the end of the linked list. def insert_at_end(self, data): new_node = Node(data) if self. start_node is None: self. start_node = new_node return n = self.
Linked List is a linear data structure which consists of a group of nodes in a sequence. Each node contains two parts. Data− Each node of a linked list can store a data. Address − Each node of a linked list contains an address to the next node, called "Next".
You can't modify a collection while you're enumerating over it.
From the docs for LinkedList<T>.GetEnumerator
:
An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and its behavior is undefined.
In practice I believe it will always throw an InvalidOperationException
, despite the behaviour officially being undefined.
EDIT: You asked in a comment whether a while
loop would help... a while loop using GetEnumerator
/MoveNext
/Current
wouldn't, but this will:
LinkedListNode<MyNode> current = myList.First;
while (current != null)
{
if (condition) // use current.Value to get the value
{
myList.AddLast(new MyNode());
}
current = current.Next;
}
As far as I'm aware, that's entirely safe and predictable. You can always ask a node for its next node. If you happen to be looking at the tail node and add another one, you'll get the new tail node when you ask for "next".
If that doesn't help, please give us more details about what you're trying to achieve.
No, enumerator object remembers internal version of owning collection. After collection is modified - version changed, so foreach will fail.
While iterating over a collection with the foreach
statement, you cannot modify it. Thus, adding items will result in a compiler error.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With