3.34. Creating Custom Enumerators

Problem

You need to add foreach support to a class, but the normal way of adding an IEnumerator class is not flexible enough. Instead of simply iterating from the first element to the last, you also need to iterate from the last to the first, and you need to be able to step over, or skip, a predefined number of elements on each iteration. All of these types of iterators should be available to your class.

Solution

The following interfaces allow polymorphic use of the foreach method:

using System.Collections;

public interface IRevEnumerator
{
    IEnumerator GetEnumerator( );
}

public interface IStepEnumerator
{
    IEnumerator GetEnumerator( );
}

The following class acts as a container for a private ArrayList called InternalList and is used in the foreach loop to iterate through the private InternalList:

public class Container : IEnumerable, IRevEnumerator, IStepEnumerator { public Container( ) { // Add dummy data to this class internalList.Add(-1); internalList.Add(1); internalList.Add(2); internalList.Add(3); internalList.Add(4); internalList.Add(5); internalList.Add(6); internalList.Add(7); internalList.Add(8); internalList.Add(9); internalList.Add(10); internalList.Add(200); internalList.Add(500); } private ArrayList internalList = new ArrayList( ); private int step = 1; IEnumerator IEnumerable.GetEnumerator( ) { return (new ContainerIterator(this)); } IEnumerator IRevEnumerator.GetEnumerator( ) { return (new RevContainerIterator(this)); } IEnumerator ...

Get C# Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.