The Moth - Hack: Prevent Enumerator Throwing (original) (raw)

« Netmodules revisited | Filter Exceptions »

Wed, February 16, 2005, 12:01 PM under dotNET

Dim i As Int32
Dim k As Int32 = mCol.Count
For i = 0 To mCol.Count - 1
Me.MethodThat_May_ResultInRemovalFromCol()

If k > mCol.Count Then  
    i -= 1  
    k = mCol.Count  
End If  
If k <= i + 1 Then      
    Exit For    
End If   

Next i

Years ago I upgraded some nasty VB6 code that, amongst other things, used the Collection class. The VB.NET Collection object allows removals from it while iterating. If you upgrade it to ArrayList, though, (apart from making changes to reflect the 0 index base), you soon find that ArrayList forbids removing items while iterating. At the time I came up with the above smelly hack. Due to recent refactorings the design/code has been modified, so I am capturing the hack here for posterity...

PS I upgraded Collection to ArrayList for performance reasons PS2 Locking the collection is irrelevant here PS3 I am aware of Synchronized - I don't like it PS4 The real solution is not to remove while iterating; it is bad design.