/* Quote from Accelerated C# 2005 # By Trey Nash # ISBN: 1-59059-717-6 # 432 pp. # Published: Aug 2006 */ using System; using System.Collections; using System.Collections.Generic; public class MainClass { static void Main() { LinkedList<int> intList = new LinkedList<int>(); for( int i = 1; i < 6; ++i ) { intList.AddLast( i ); } CircularIterator<int> iter = new CircularIterator<int>(intList, intList.First); int counter = 0; foreach( int n in iter ) { Console.WriteLine( n ); if( counter++ == 100 ) { iter.Stop(); } } } } public class CircularIterator<T> : IEnumerable<T> { public CircularIterator( LinkedList<T> list, LinkedListNode<T> start ) { enumerator = CreateEnumerator( list, start, false ).GetEnumerator(); enumType = enumerator.GetType(); } public void Stop() { enumType.GetField("stop").SetValue( enumerator, true ); } private IEnumerator<T> enumerator; private Type enumType; private IEnumerable<T> CreateEnumerator( LinkedList<T> list, LinkedListNode<T> start, bool stop ) { LinkedListNode<T> current = null; do { if( current == null ) { current = start; } else { current = current.Next; if( current == null ) { current = start; } } yield return current.Value; } while( !stop ); } public IEnumerator<T> GetEnumerator() { return enumerator; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1