IEnumerable和IEnumerator


IEnumerable接口只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。IEnumerator对象是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。IEnumerator接口定义了一个Current属性,MoveNext和Reset两个方法,既然IEnumerator对象时一个访问器,那至少应该有一个Current属性,来获取当前集合中的项
MoveNext方法只是将游标的内部位置向前移动,简单来说就是移到一下个元素而已),要想进行循环遍历,就需要用到这个

IEnumerator:提供在普通集合中遍历的接口,有Current,MoveNext(),Reset(),其中Current返回的是object类型。

<1>、在简单的web页面中

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
test A = new test();
foreach (Ca c in A)
{
Label1.Text = Label1.Text + c.a.ToString() + c.b.ToString();
}
}
//public IEnumerable<int> IEnumerable { get; set; }

public class test
{
Ca[] IEnum = new Ca[4];
//启动时填充一些Ca对象
public test()
{
//为数组字段赋值
IEnum[0] = new Ca { a = "a", b = 30 };
IEnum[1] = new Ca { a = "b", b = 50 };
IEnum[2] = new Ca { a = "c", b = 30 };
IEnum[3] = new Ca { a = "d", b = 45 };
}
//用接口实现对对象的遍历
public IEnumerator GetEnumerator() //实现接口
{
return this.IEnum.GetEnumerator();
}
}
public class Ca
{
public string a { get; set; }
public int b { get; set; }
}
}

<2>如以上代码没有下面这个实现接口的代码,

public IEnumerator GetEnumerator() //实现接口
{
return this.IEnum.GetEnumerator();

则会出现:“_Default.test”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“_Default.test”类型的变量的错误,使用IEnumerator是实现当一个对象是集合的时候,循环遍历

二、然而到这里而IEnumerable和IEnumerator 的有人又会问区别又是什么呢?

在看IEnumerable这个定义的时候可以看出IEnumerable中包含一个IEnumerator,则总结一下内容:

IEnumerable<T>:继承自IEnumerable,暴露一个IEnumerator<T>,支持在泛型集合中遍历。

直接上代码给来看:

//IEnumerable的使用方法
IEnumerable<Ca> a { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
List<Ca> s = new List<Ca>();
Ca d = new Ca();
d.a = "1";
d.b = 2;
s.Add(d);
a = s;
if (a == null) { Label1.Text = "1"; }
else
{
foreach (Ca c in a)
{
Label1.Text = Label1.Text + c.a.ToString() + c.b.ToString();
}
}
}
public class Ca
{
public string a { get; set; }
public int b { get; set; }
}

从上面的代码可以看出,IEnumerable可以接受一个泛型集合,且由于暴露一个IEnumerator<T>所以该对象也可以被遍历。

原文地址:https://www.cnblogs.com/May-day/p/5445524.html