Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

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

Posted on 2006-06-26
4
279 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
ID: 16983148
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
ID: 16983604
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
ID: 16984292
Just like your example, except use an index instead of foreach.
0
 
LVL 34

Assisted Solution

by:Sancler
Sancler earned 200 total points
ID: 16984341
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

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
VB.Net - TypeInitializer Error 25 32
vb.net 1 month apart 11 35
Convert datetime to time string 10 28
vb.net class 3 21
This article explains how to create and use a custom WaterMark textbox class.  The custom WaterMark textbox class allows you to set the WaterMark Background Color and WaterMark text at design time.   IMAGE OF WATERMARKS STEPS Create VB …
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…

838 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