Enumerators in C#

This article has been excerpted from book "The Complete Visual C# Programmer's Guide" from the Authors of C# Corner.

As explained earlier, C# has a new iteration syntax called foreach. The foreach statement can only be applied to objects of classes that implement the IEnumerable interface. The IEnumerable interface exposes the enumerator, which supports a simple iteration over a collection. Enumerators are intended to be used only to read data in the collection and cannot be used to modify the underlying collection. The enumerator does not have exclusive access to the collection. To understand what happens in the background, consider the code snippet in Listing 5.57.

Listing 5.57: Enumerator Example 1

(int i in a)

This code functions just like the while loop used in Listing 5.58.

Listing 5.58: Enumerator Example 2

        a = x.GetEnumerator();
        while (a.MoveNext())

Please refer to the C# Language Specification (http://msdn.microsoft.com/en-us/library/aa645596(VS.71).aspx) for more details and recent updates to the C# language.

Before entering the statement block, the compiler generates the code to call the method GetEnumerator of the object passed as the second parameter in the foreach statement. The GetEnumerator method must return an object, having a property named Current, of type similar to the first argument of the foreach statement. Also this object must have a MoveNext method of return type bool. This method informs the runtime when to terminate the loop.

When an enumerator is instantiated, it takes a snapshot of the current state of the collection. If changes are made to the collection, such as the addition, modification, or deletion of elements, the snapshot gets out of sync and the enumerator throws an InvalidOperationException. Two enumerators instantiated from the same collection simultaneously can have different snapshots of the collection.

If the enumerator is positioned before the first element in the collection or after the last element in the collection, the enumerator is in an invalid state. In that case, calling Current throws an exception.

The enumerator is positioned before the first element in the collection initially. The Reset function brings the enumerator back to this position. The MoveNext method must be called to advance the enumerator to the first element of the collection before reading the value of Current, after an enumerator is created or after a Reset. The Current property returns the same object until either MoveNext or Reset is called.

Once the end of the collection is passed, the enumerator is in an invalid state and calling MoveNext returns false.

Calling Current throws an exception if the last call to MoveNext returned false. With this information under your belt, you should insert your enumerating code inside a try-catchfinally block to prevent unexpected exits.


Hope this article would have helped you in understanding Enumerators in C#. See other articles on the website on .NET and C#.

visual C-sharp.jpg
The Complete Visual C# Programmer's Guide covers most of the major components that make up C# and the .net environment. The book is geared toward the intermediate programmer, but contains enough material to satisfy the advanced developer.