Posts tagged: IEnumerable

Jun 09 2009

Arraylist and generics don’t mix with IEnumerable(Of T).GetEnumerator.

The other day I was writing an in-house tool to assist in some upgrades we were performing on client installations. This tool was supposed to perform its operations on a batch of items, and display the results upon completion.

Since processing this batch of items was a lengthy endeavor, I wanted the failure to process one of the items to simply be recorded and allow the processing of the others to continue. Part of the processing of each item was a call to multiple web services, so I would need a way to handle the collection of errors along the way and make them available for their eventual display.

I had what I thought was a clever idea: a private Arraylist of exceptions that occurred during processing.

[vbnet]
Public Class BatchExceptions
Implements ICollection(Of System.Exception)

Private mExceptionlist As ArrayList
.
.
.
End Class
[/vbnet]

That way, I could simply iterate over the list and perform the standard exception handling, like so:

[vbnet]
Dim exc As Exception
For Each exc In BatchExceptions
HandleError(exc)
Next
[/vbnet]

Of course, in order to make use of the “For Each” construct, I had to implement the GetEnumerator of the ICollection interface.

[vbnet]
Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of System.Exception) _
Implements System.Collections.Generic.IEnumerable(Of System.Exception).GetEnumerator
Return (mExceptionlist.GetEnumerator)
End Function
[/vbnet]

Cool. Only one problem:

arraylist-and-generics-dont-mix-when-enumerating-generics_generics-enumerator

That was OK though, because I was using generics after all. The compiler was being helpful and reminding me that I had to specify ‘IEnumerator(Of Exception)’:

arraylist-and-generics-dont-mix-when-enumerating-generics_generics-enumerator2

[vbnet]
Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of System.Exception) _
Implements System.Collections.Generic.IEnumerable(Of System.Exception).GetEnumerator
Return (DirectCast(mExceptionlist.GetEnumerator, IEnumerator(Of Exception)))
End Function
[/vbnet]

Everything compiled fine, but at run-time I got the following RTE:

Unable to cast object of type ‘ArrayListEnumeratorSimple’ to type ‘System.Collections.Generic.IEnumerator`1[System.Exception]‘.

arraylist-and-generics-dont-mix-when-enumerating-generics_generics-enumerator-rte

This was frustrating. It seemed like the compiler failed to warn me of this incompatibility, and simply kicked the can on down the road to the run-time to deal with.

Solution:

Well, I did a little poking around and finally ended up replacing my Arraylist with a list like so:

[vbnet]
private mExceptionlist as System.Collections.Generic.list
[/vbnet]

Well, that did the trick but I can’t say it was as intuitive as it would seem. It makes sense, in hindsight, but why did I have to get some cryptic RTE? Why couldn’t the compiler have picked up on my use of an ArrayList and say, “Hey dummy - use a generic list!”? Still, I have a new trick to toss in my bag for the time I want to implement an enumerator on an Arraylist!

Blog Traffic Exchange Related Posts Blog Traffic Exchange Related Websites
  • Explaining the ‘Mental’ Side of Weight-Loss This is a guest article written by Dr. Michael A. Snyder, MD, FACS, creator of FullBar. The major barrier to weight loss is accepting the need to change your diet, behaviors, AND relationship with food. These changes require a commitment. And, all of us know that commitments are very difficult!!......
  • Opening my mind to money Tread pointed out something that's going on over at Millionaire Mommy Next Door. MMND said: "For the next 30 days, I'll open my mind to receive increasingly more money. On day one, I'll decide how I'd like to spend $100. On day two, I'll double that amount to $200. Day......
  • Ebay Tips For Sellers For the last few weeks I have been selling items on eBay to finance two operations. I have been on a reading kick lately and am reading anything and everything I can get my hands on related to personal finance and personal development. I truly believe the saying, "You'll be......
  • Making money with an eBay Store, Part 7: Streamlining your shipping process (This post is part of a series on Making Money with an eBay Store. The Introduction and table of contents to the series is here.) Part 6 of this series on making money with eBay Storesshowed some of the things I do to streamline my listing process. The idea is......
  • Crucial SEO Services For Inspiring Website Development Advancements To be successful in online business or even just for fun, you need to get noticed. No one will read or buy from you if they can’t find you right? But, how do you get yourself out there so people CAN find you? That is where search engine optimisation services,......