迭代器

原创 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的枚举集合的工作,从性能上没有什么变化。对于其生成的中间语言没有太多的变化。
 

c++迭代器的使用与简介

c++迭代器的使用与简介     除了使用下标来访问vector对象的元素外,标准库还提供了另一种检测元素的方法:使用迭代器(iterator)。迭代器是一种允许程序员检查容器内...
  • u012547790
  • u012547790
  • 2014年05月05日 16:08
  • 1955

C/C++迭代器使用详解

迭代器是一种检查容器内元素并遍历元素的数据类型。
  • u013171165
  • u013171165
  • 2014年06月23日 11:00
  • 8680

正确使用迭代器注意事项

正确使用迭代器注意事项
  • u012333003
  • u012333003
  • 2014年04月20日 14:57
  • 1329

<C++>迭代器:访问string对象和vector对象

转载于此文:C++学习笔记(十):迭代器我们都知道可以用下标运算来访问string对象和vector对象。而另外还有一种更通用的方法也可以实现这样的方法。名曰:迭代器(iterator)。类似于指针,...
  • jenny_84
  • jenny_84
  • 2015年04月01日 13:44
  • 3730

迭代器删除操作写法及解释

1 迭代器是什么? 迭代器是一种典型的设计模式,与集合配套使用,其目的是隐藏集合中的内部成员,并且提供对集合成员的访问能力。其结构如下图所示; 具体协作关系及实现方式,就不在此赘述...
  • sandware
  • sandware
  • 2014年11月08日 18:50
  • 645

map用迭代器进行遍历的方法总结

注意:不能直接拿map的key值作为迭代器进行遍历public static void main(String[] args) { Map map = new HashMap(); map.p...
  • u011073567
  • u011073567
  • 2016年12月01日 21:33
  • 2417

迭代器失效的几种情况总结

1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删...
  • lujiandong1
  • lujiandong1
  • 2015年11月16日 22:11
  • 3333

php中的迭代器Iterator的具体用法

php中的迭代器Iterator的具体用法。 一,最简单的迭代形式 foreach语句 1,foreach 可以用于数组, 例如: 复制代码代码示例: foreach ($arr as $key=>...
  • senlin1202
  • senlin1202
  • 2016年03月04日 09:55
  • 2465

python3:迭代器

python支持在容器上迭代,通过两个方法实现,允许用户自定义,序列总是支持迭代方法,后面介绍序列的时候会涉及更多的细节。 容器中的迭代 容器需要定义下面的方法以提供迭代支持: containe...
  • liuy_98_1001
  • liuy_98_1001
  • 2015年03月25日 15:06
  • 2597

Java中迭代器是什么?

可迭代是Java集合框架下的所有集合类的一种共性,也就是把集合中的所有元素遍历一遍。迭代的过程需要依赖一个迭代器对象,那么什么是迭代器呢?    迭代器(Iterator)模式,又叫做游标模式,它的含...
  • qq_33642117
  • qq_33642117
  • 2016年08月16日 21:31
  • 2242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:迭代器
举报原因:
原因补充:

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