标签:ienumerable ienumerator yield return 迭代器
终于把硕士所有的课业都完成了。。。
今天就写一点关于IEnumerator和IEnumerable这两个概念,之前写金融模型的时候用到过,当时也没太搞清楚,这两天看了C#in Depth,觉得里面解释的不错,虽然例子有点错误。所以今天就写一篇关于这两个概念的文章。
首先,我有一个先入为主的概念,IEnumerable就好比是一个数组类型。一想到数组,我们就能很轻而易举地联想到Foreach遍历的语法。那么问题是Foreach是怎么实现的呢?答案就是你调用Foreach的时候这个类似数组的IEnumerable的数据类型会调用其内部的一个方法——GetEnumerator
,他返回一个IEnumerator类型。
具体的来说,这个IEnumerator类型里面包含了Current,MoveNext以及Reset方法。Foreach每次执行时就是在调用这三个方法。
下面是一个例子:本例中MyArray是一个实现了IEnumerable<int>的类型,其中有一个很重要的方法是GetEnumerator;返回一个实现IEnumerator<int>的Iterator,本身this(MyArray)作为参数。在main函数里面,for each的对象是MyArray类型数据,每次loop会先调用MoveNext,而后Current。Reset我觉得应该是For Each整个结束后,包括诸如Dispose等等的时候调用,但是我没有考证哈。最后我们就看到结果了。
最后值得一提的是GetEnumerator中可以使用yield return,这样就不需要Iterator这个类型了,非常直观方便,是C# 2.0及之后版本的语法。
public class MyArray : IEnumerable<int>
{
public int[] values;
public MyArray(int[] Array)
{
this.values = Array;
}
//实现接口IEnumerable
public IEnumerator<int> GetEnumerator()
{
return new Iterator(this);
//for (int i = 0; i < values.Length; i++)
//{
// yield return values[i];
//}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
//IEnumerator实现类,MyArray作为成员
public class Iterator : IEnumerator<int>
{
private MyArray mMyArray;
private int mPosition;
public Iterator(MyArray myArray)
{
this.mMyArray = myArray;
this.mPosition = -1;
}
//实现IEnumerator接口
public int Current
{
get
{
//如果没有执行MoveNext就执行Current会报错
//或者执行到最后一个元素之后
if (mPosition == -1||mPosition == mMyArray.values.Length)
{
throw new Exception();
}
else return mMyArray.values[mPosition];
}
}
public bool MoveNext()
{
bool isNotEnd;
if (mPosition < mMyArray.values.Length-1)
{
mPosition++;
isNotEnd = true;
}
else isNotEnd = false;
return isNotEnd;
}
public void Reset()
{
mPosition = -1;
}
public void Dispose()
{}
object System.Collections.IEnumerator.Current
{
get { throw new NotImplementedException(); }
}
}
class Program
{
static void Main(string[] args)
{
MyArray array = new MyArray(new int[] { 1, 2, 3, 4, 5 });
foreach (var item in array)
{
Console.WriteLine(item.ToString());
}
Console.Read();
}
}
【C#】 26. 关于IEnumerable和IEnumerator
标签:ienumerable ienumerator yield return 迭代器
原文地址:http://blog.csdn.net/huiwuhuiwu/article/details/46276655