IEnumerable及IEnumerator接口
(Enumerator:枚举器; Iterator:迭代器)
(一)IEnumerable接口
public interface IEnumerable
{
//IEnumerable只有一个方法,返回可循环访问集合的枚举数
IEnumeratorGetEnumerator() ;
}
注意:实现IEnumerable接口的类,可以支持foreach循环遍历对象的集合元素。
(二)IEnumerator接口
public interfaceIEnumerator
{
// 方法:移到集合的下一个元素。如果成功则返回为true;如果超过集合结尾,则返回false
bool MoveNext();
//将集合设置为初始位置,该位置位于集合中第一个元素之前
void Reset();
//属性:获取集合中的当前元素
object Current { get; }
}
注意:要定义一个枚举器,就
必须实现IEnumrator接口。
(三)经典错误
“Iterator.***”不包含“GetEnumerator”的公共定义,因此 foreach语句不能作用于“Iterator.***”类型的变量。
解决办法:实现IEnumerable 接口的GetEnumerator方法。
(四)IEnumerable 接口的实现
想要使用foreach语句,必须实现IEnumerable接口。
这个接口只要求实现一个方法:GetEnumerator。这个方法必须返回一个实现IEnumerator接口的对象。实现IEnumerator接口的最好办法是在IEnumerable类里创建一个嵌套的IEnumerator类。
//Student类中部分代码:
public class Student: IEnumerable
{
private string[]arr = new string[] { "语文", "数学", "外语" };
public IEnumerator GetEnumerator()
{
for (int i = 0; i< arr.Length; i++)
{
yield returnarr[i];
}
}
……
}
//Program中部分代码:
Student student =new Student();
foreach (String str in student)
{
Console.WriteLine(str);
}
(五)IEnumerator接口的实现
实现IEnumerator接口的最好办法是在IEnumerable类里创建一个嵌套的IEnumerator类。
public IEnumeratorGetEnumerator()
{
return new ListBoxEnumerator();
}
public classListBox : IEnumerable
{
// 嵌套的私有ListBoxEnumerator类实现
private class ListBoxEnumerator :IEnumerator
{
// 代码实现...
}
// ListBox类的代码...
}
(补)yield语句
包含yield语句的方法或属性称为迭代块。迭代块必须声明为返回IEnumerator或IEnumerable接口。这个块可以包含多个yield return语句或yield break语句,但不能包含return语句。
yield return语句:返回集合的一个元素,并移动到下一个元素上。
yield break语句:停止迭代。
yield 语句只能出现在iterator 块中,该块可用作方法、运算符或访问器的体。