O'Reilly logo

C# Cookbook by Jay Hilyard, Stephen Teilhet

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

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 ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required