迭代器

  • 迭代器 能使你获得序列中所有元素而不用关心其类型是array,list,link list或者其他序列结构。

  1,实现接口IEnumerable就可以实现数据迭代。其中调用GetEnumerator方法返回Enumerator接口的实现,就是迭代器本身。

 

  class BookColletion:IEnumerable{
        #region IEnumerable 成员

        public IEnumerator GetEnumerator()
        {
            //return 一个IEnumerator对象
            return new Enumerator(items);
        }

        private class Enumerator : IEnumerator {

            #region IEnumerator 成员
            public Enumerator(object[] items) {
                elements = new object[items.Length];
                Array.Copy(items,elements,items.Length);
            }
            public object Current
            {
                get {
              if(cursor>elements.Length-1){
                  throw new Exception("Enumeration already finished.");
              }
              if (cursor == -1) {
                  throw new Exception("Enumeration not started.");
              }
              return elements[cursor];
              }
            }

            public bool MoveNext()
            {
                ++cursor;
                if(cursor>(elements.Length-1)){
                    return false;
                }
                return true;
            }

            public void Reset()
            {
                cursor = -1;
            }

            #endregion
            private int cursor;
            private object[] elements = null;
        } 
        

        #endregion
        public object[] items=null;
    }


    class Program
    {
        static void Main(string[] args)
        {
            BookColletion b = new BookColletion();
            b.items = new object[] {"1","d","d"};
            IEnumerator enumertor = b.GetEnumerator();
            enumertor.MoveNext();
            Console.Write(enumertor.Current);
            Console.Read();

        }
    }

 

    您只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成 IEnumerable 或 IEnumerable<T> 接口的 Current、MoveNext 和 Dispose 方法。

     迭代器是可以返回相同类型的值的有序序列的一段代码。

     迭代器可用作方法、运算符或 get 访问器的代码体。

     迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。

     可以在类中实现多个迭代器。每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}

     迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。

 

yield实现简介迭代:

  class Program
    {

        static void Main(string[] args)
        {
            //用数组实现输出
            TheWeek week = new TheWeek();
            for (int i = 0; i < week.weeks.Length;i++ ) {
                Console.Write(week.weeks[i]+"\n\r");
            }
            DayofTheWeek dweek = new DayofTheWeek();
            
            foreach(string x in dweek){
                Console.Write(x);
            }       
            Console.Read();
        }

    }
    //迭代器 
     public  class TheWeek {
      //为public;
        public  string[] weeks ={ "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
    }
    public class DayofTheWeek :IEnumerable{
        private string[] weeks ={ "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

        #region IEnumerable 成员
        public IEnumerator GetEnumerator()
        {
      
                for (int i = 0; i < weeks.Length; i++)
                {
                     yield return weeks[i];
                }

        }
        #endregion
    }

 

posted @ 2013-12-31 15:27  UCanBeFree  阅读(167)  评论(0编辑  收藏  举报