分享

C# 迭代器实现枚举器

 昵称10504424 2013-02-19

在上一篇日志中说的手动实现枚举器来枚举自定义的类型,

http://blog.csdn.net/weixingstudio/article/details/6817319

可以看到过程非常复杂,而且容易出错。为了减轻程序员的负担,C#还提供了迭代器来帮助程序员完成其中的大部分工作。

 

迭代器(iterator)是能生成已排序值序列的一个代码块。迭代器实质上并不是一个可枚举的类的成员,迭代器只是指定了一个序列,枚举器应该用这个序列来返回其中的值。也就是说,迭代器只是对枚举序列的一个描述,C#编译器可以利用它来创建自己的枚举器。

 

下面看代码:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace Iterator  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             MyCollection<string> collect = new MyCollection<string>();  
  13.             collect.FillList("china","american","australia","germany","japan","korea","canada");  
  14.             foreach (string t in collect)  
  15.             {  
  16.                 Console.WriteLine(t);  
  17.             }  
  18.         }  
  19.     }  
  20.   
  21.     class MyCollection<T> : IEnumerable<T>  
  22.     {  
  23.         private List<T> myList=new List<T>();  
  24.   
  25.         public void FillList(params T[] items)  
  26.         {  
  27.             foreach(T t in items)  
  28.             {  
  29.                 myList.Add(t);  
  30.             }  
  31.         }  
  32.   
  33.         IEnumerator<T> IEnumerable<T>.GetEnumerator()  
  34.         {  
  35.             foreach (var t in myList)  
  36.             {  
  37.                 yield return t;  
  38.             }  
  39.         }  
  40.   
  41.         System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()  
  42.         {  
  43.             //throw new NotImplementedException();  
  44.             return null;  
  45.         }  
  46.     }  
  47. }  


MyCollection 这个类实现了Ienumerable<T>接口,并且是显示的实现。在GetEnumerator() 方法中,通过yield 关键字返回要获取的数据。

 

yield 说明:yield 关键字制订了每一次迭代要反悔的值,它临时将方法叫停,将一个值传给调用者。当调用者需要下一个值时,GetEnumerator() 方法就从上次暂停的地方继续,生成下一个值。最终所有的数据都被访问,GetEnumerator()方法将终止。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多