IEnumerable及IEnumerator接口

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 块中,该块可用作方法、运算符或访问器的体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值