Circular Iterator : IEnumerator : Data Structure C# Examples


C# Examples » Data Structure » IEnumerator »

 

Circular Iterator









    
/*
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();
        }
}
    
   
  
   



Output

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


HTML code for linking to this page:

Follow Navioo On Twitter

C# Examples

 Navioo Data Structure
» IEnumerator