IEnumerable接口和迭代器
时间:2010-12-29 来源:打瞌睡的耶稣
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。