分享

IEnumerable接口和迭代器介绍

 kittywei 2012-02-24

一、概述

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

2.迭代器可以用作方法,get 访问器

3.使用yield return 返回每个值,yield break 可以中止迭代

4.可以在一个类中使用多个迭代。

二、构建自己的迭代器

如何构建自己的迭代器呢。

1、最常用的方法是实现IEnumerable接口的GetEnumerator() 方法。

如下:

public IEnumerator GetEnumerator()  
{  
    for (int i = 0; i < 100; i++)  
    {  
        yield return "耶稣的迭代器,序号:"+ i + " -----!";  
    }  

此类必须继承接口IEnumerable.即:public class TRJEnumerable:IEnumerable

这样,就实现了自己的一个迭代器,可以在别的地方应用了.

    TRJEnumerable trjEnumerable = new TRJEnumerable();

            foreach (string s in trjEnumerable)
            {
                Console.WriteLine(s);
            }

2、可以不继承接口IEnumerbale,但在类的内部要实现一个返回IEnumerable类型的方法。

如下:

public class TRJIEnumerbaleDemon1
   {
       public IEnumerable SampleIterator()
       {
           yield return "耶稣:1";
           yield return "耶稣:2";
           yield return "耶稣:3";
           yield break;
           yield return "耶稣:4";
       }
   }

调用的时候:

 TRJIEnumerbaleDemon1 trjiEnumerbaleDemon1 = new TRJIEnumerbaleDemon1();

            foreach (string value in trjiEnumerbaleDemon1.SampleIterator())
            {
                Console.WriteLine(value);
            }

当然,这个自定义方法可以带有参数。比如:想对同一数据源执行2种不同的访问形式,可以提供一个按升序返回元素的迭代器,而提供按降序返回元素的另一个迭代器。


       /// <summary>
       /// 升序迭代
       /// </summary>
       /// <param name="start"></param>
       /// <param name="end"></param>
       /// <returns></returns>
       public IEnumerable ASCIterator(int start,int end)
       {
           if (start<=end)
           {
               for(int i=start;i<=end;i++)
               {
                   yield return "对应的耶稣是:" + i;
               }
           }
       }

这样可以随心所欲的控制返回的值.

3、应用

最近在做一个小工具,数据源是一些类型,比如:int ,long,string,byte,zcInt,zcBool等。

可以把这样类型配置在一个xml中,然后程序启动的时候读取。自定义自己的类型迭代器,返回自己的类型值。

4、对接口IEnumerable和IEnumerator的区别不是怎么了解,但大致看了一下:

IEnumerable 接口只有方法GetIEnumerator()这个方法。

IEnumerator接口有一个属性,2个方法:MoveNext(),Reset(),Current。

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多