一、定义:
IEnumerable:枚举接口。
IEnumerator:枚举器接口。
二、使用方式:
IEnumerable:
IEnumerator GetEnumerator() //返回IEnumerator
IEnumerator:
Current{get{}}//返回元素的光标所在的位置
MoveNext() //移动到集合的下一个元素
Reset() //重置
Dispose() //接口IEnumerator <T>来自接口IDisposable,从而定义了该方法清理由enumerator分配的资源。
三、特点:
IEnumerable
1. 实现IEnumerable不是必需的。
2. 当你实现IEnumerable,你也必须实现IEnumerator。
3. 通过GetEnumerator()返回一个IEnumerator。
IEnumerator
1. 可用于读取集合中的数据,但不能用于修改基础集合。
2. 枚举数位于集合中的第一个元素之前。必须调用MoveNext方法将枚举数提前到集合的第一个元素之前读取Current;否则,Current将是不确定的。
3. Current返回相同的对象直到MoveNext或Reset被调用。MoveNext设置到下一个元素。
4. 如果MoveNext读取到了集合的末尾,枚举数定位在最后一个元素之后,MoveNext返回false。当枚举数位于此位置,随后调用MoveNext也返回false。如果MoveNext返回false,则Current抛出异常。
5. 没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项。通过foreach语句遍历集合的应用。
四、区别:
| IEnumerable | IEnumerator |
名称 | 枚举接口 | 枚举器接口 |
使用方式 | public IEnumerable<string> Reverse(){...}
foreach (var title in titles.Reverse()){...}
| public IEnumerator<string> GetEnumerator(){...}
foreach (var title in titles){...}
|
函数 | IEnumerator GetEnumerator() | Current{get{}} Dispose() |
关系 | 返回 IEnumerator 或 IEnumerable 的迭代器的产生类型是 object。 | |
返回 IEnumerator<T> 或 IEnumerable<T> 的迭代器的产生类型是 T。 | ||
如果实现IEnumerable,则必须实现IEnumerator。 | ||
foreach通过GetEnumerator()方法返回一个IEnumerator对象,调用方法MoveNext()进行遍历,返回current值。 | ||
|
五、实例:
public class Person
{
public Person(string name)
{
this.name = name;
}
public string name;
}
//IEnumerator:
public class enumerator : IEnumerator
{
public Person[] p;
public int i;
public enumerator(Person[] p0)
{
p = new Person[p0.Length];
for (int j = 0; j < p0.Length; j++)
{
p[j] = new Person(p0[j].name);
}
i = -1;
}
public object Current { get{ return p[i]; } }
public bool MoveNext()
{
if (i < p.Length-1)
{
i++;
return true;
}
else
{
return false;
}
}
public void Reset()
{
i = -1;
}
}
//IEnumerable:
public class enumerable : IEnumerable
{
public Person[] p;
public enumerable()
{
p = new Person[3];
p[0] = new Person("a");
p[1] = new Person("b");
p[2] = new Person("c");
}
public IEnumerator GetEnumerator()
{
enumerator a = new enumerator(p);
return a;
}
}
class Program
{
static void Main(string[] args)
{
enumerable pp;
pp = new enumerable();
foreach (Person ps in pp)
{
Console.WriteLine(ps.name);
}
Console.ReadLine();
}
}
}
输出结果:
a
b
c