Solved

Collection Error - Collection was modified; enumeration operation may not execute

Posted on 2006-06-26
4
275 Views
Last Modified: 2008-01-09
I’ve got an arraylist which I use extensively throughout my program. There are areas that add to the list and areas that amend items in the list. But I keep getting this error ‘Collection was modified; enumeration operation may not execute’. I sort of understand the reason for the error, but can’t find a way around it.

I need iterate through the array and amend data in the array where needed.

So what's the best way to update an item in an arraylist without getting the error ?

I’ve tried assigning the arraylist item as :   arrData(1) = “x”
And also tried removing the item and re-adding (not the best)

This is a back to basics question I know. But I can’t find any literature on it.
0
Comment
Question by:Kinger247
4 Comments
 
LVL 9

Expert Comment

by:lojk
Comment Utility
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.en/cpref2/html/P_System_Collections_ArrayList_SyncRoot.htm

Dim myCollection As New ArrayList()
 Dim item As Object
 SyncLock myCollection.SyncRoot
  For Each item In myCollection
  ' Insert your code here.
  Next item
 End SyncLock

will lock the collection to other  code whilst you are modifying/reading it

0
 
LVL 10

Author Comment

by:Kinger247
Comment Utility
I see, but how do you loop through an array and amend its items ?
I've created a small app below, which is sort of what I'm trying to do. But after the first item update, the code fails on the 'next' statement with the ‘Collection was modified; enumeration operation may not execute’ error, then misses out on the other items.

'// CODE ---------------------------------------

    Private Structure Struct
        Dim Name As String
        Dim Age As Integer
    End Structure

    Private Array As New ArrayList

    Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
        Dim Struct As Struct = Nothing
        Dim i As Integer = 0

        Try

            For Each Struct In Array
                i += 1

                With Struct
                    .Age += 1
                End With

                Array(i) = Struct
            Next

        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Sub
0
 
LVL 21

Accepted Solution

by:
mastoo earned 300 total points
Comment Utility
Just like your example, except use an index instead of foreach.
0
 
LVL 34

Assisted Solution

by:Sancler
Sancler earned 200 total points
Comment Utility
You're mixing up two approaches

    Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
        Dim Struct As Struct = Nothing
        Dim i As Integer = 0

        Try

            'Approach using INDEX
            For i = 0 To array.Count - 1
                Struct = array(i)
                With Struct
                    .Age += 1
                End With
                array(i) = Struct
            Next

            'Approach using ENUMERATOR
            For Each Struct In array
                With Struct
                    .Age += 1
                End With
            Next

        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Sub

The line

                array(i) = Struct

which is appropriate for the first, modifies the collection, thus producing an error in the second.  You should use either one or the other.

Roger
0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Article by: Kraeven
Introduction Remote Share is a simple remote sharing tool, enabling you to see, add and remove remote or local shares. The application is written in VB.NET targeting the .NET framework 2.0. The source code and the compiled programs have been in…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now