• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 301
  • Last Modified:

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

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
Kinger247
Asked:
Kinger247
2 Solutions
 
lojk.Net and Infrastructure ConsultantCommented:
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
 
Kinger247Author Commented:
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
 
mastooCommented:
Just like your example, except use an index instead of foreach.
0
 
SanclerCommented:
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

Prep for the ITIL® Foundation Certification Exam

December’s Course of the Month is now available! Enroll to learn ITIL® Foundation best practices for delivering IT services effectively and efficiently.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now