迭代器

原创 2007年10月01日 00:59:00
迭代器是使用在foreach中的集合。以前写过一篇《小议foreach》。在其中写了实现一个可以用于foreach的集合。在C#2.0中使用迭代器创建一个用于foreach的集合,实现上比较简单:继承于IEumnerable,并实现GetEnumerator()。
首先这个集合要基于IEnumerable(可以使用泛型),下面先来实现一个非泛型版的迭代器。代码如下(非泛型代码示例来源于MSDN):
public class DaysOfTheWeek : System.Collections.IEnumerable
        {
            string[] m_Days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
 
            public System.Collections.IEnumerator GetEnumerator()
            {
                for (int i = 0; i < m_Days.Length; i++)
                {
                    yield return m_Days[i];
                }
            }
        }
 
        class TestDaysOfTheWeek
        {
            static void Main()
            {
                DaysOfTheWeek week = new DaysOfTheWeek();
                foreach (string day in week)
                {
                    System.Console.Write(day + " ");
                }
                Console.Read();
            }
      }
操作结果是:
Sun Mon Tue Wed Thr Fri Sat
其中yied return关键字产生枚举元素
 
泛型版迭代器的实现代码如下:
static void Main(string[] args)
        {          
            Stack<int> stack = new Stack<int>();
            stack.items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            foreach (int i in stack)
            {
                Console.WriteLine(i);
            }
            Console.Read();
     }
public class Stack<T> : IEnumerable<T>
    {
        public T[] items;
 
        public IEnumerator<T> GetEnumerator()
        {
            for (int i = 0; i < items.Length; i++)
            {
                yield return items[i];
            }
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
}
运行结果如下:
1
2
3
4
5
6
7
8
9
10
其中G
在实现泛型迭代器时我一直没有写IEnumerator IEnumerable.GetEnumerator()这个方法,所以编译器一直在给我报错,(猜想)这个方法应该IEnumerator<T>接口中的一个抽象方法。而这个方法中调用的GetEnumerator(),通过集成环境中的提示发现,实际上是上面写到的IEnumerator<T> GetEnumerator()这个泛型方法。
 
在自定义迭代器时,我们可以利用yield break关键字跳出循环。如上面的例子中,我们想只输出小于等于5的项,调整上面代码,如:
public class Stack<T> : IEnumerable<T>
    {
        public T[] items;
 
        public IEnumerator<T> GetEnumerator()
        {
            for (int i = 0; i < items.Length; i++)
            {               
                if ((Convert.ToInt32(items[i]) > 5))
                    yield break;
                yield return items[i];
            }
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
操作结果:
1
2
3
4
5
 
迭代器的机制:
    实际上迭代器只是在C#2.0中通过编译器一层额外处理的,用来简化创建可用于foreach的枚举集合的工作,从性能上没有什么变化。对于其生成的中间语言没有太多的变化。
 

相关文章推荐

Android迭代器模式demo

  • 2016年04月13日 16:53
  • 15.44MB
  • 下载

php迭代器代码

  • 2014年02月24日 11:34
  • 895B
  • 下载

设计模式(9)---->迭代器模式

迭代器 一、 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java Collection的遍历: List list = new ArrayLis...

Headfirst(九)迭代器模式

  • 2015年10月21日 15:32
  • 1.7MB
  • 下载

c++迭代器失效问题

  • 2015年10月13日 17:14
  • 165KB
  • 下载

使用python迭代器生成斐波那契数列

斐波纳契数列以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*) 这个数列从第2项开始,每一项都等于前两项之和,而且当n趋向于无穷大时,前一项与后一项...

C++容器、迭代器

  • 2013年04月24日 10:47
  • 1.67MB
  • 下载

(行为型模式) Iterator 迭代器模式

  • 2012年09月29日 23:50
  • 171KB
  • 下载

ListView配合安卓适配器Adapter和迭代器Iterator的用法整理

ListView+Adapter+Iterator 二、Iterator 安卓迭代器Iterator对collection进行迭代,在处理显示数据时,可用于遍历数据,配合Adapter使用效...
  • easy41
  • easy41
  • 2016年10月19日 15:21
  • 123

数据结构 模板与迭代器

  • 2013年01月23日 22:06
  • 497KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迭代器
举报原因:
原因补充:

(最多只允许输入30个字)