【C#】构建可枚举类型(IEnumerable和IEnumerator)
2024-08-27 02:22:19
为了开始对实现既有接口的了解,我们就看一下IEnumerable和IEnumerator的作用,想一下,C#支持关键字foreach,允许我们遍历任何数组类型的内容:
//遍历数组的项
int[] myArray={,,}
foreach(int i in myArray)
{......}
虽然看上去只有数组类型才能使用这个结构,其实任何支持GetEnumerator()方法的类型都可以通过foreach结构进行运算,举例说明,我们新建一个项目。
首先,我们创建一个类
public class Car
{
public int Speed{get;set;}
public string PetName { get; set; } public Car(int s, string p)
{
this.Speed = s;
this.petName = p;
}
}
接下来我们再建一个类,用来在System.Array中保存一组Car类型
public class Garage
{
private Car[] carArray = new Car[];
public Garage()
{
carArray[] = new Car(,"Rusty");
carArray[] = new Car(, "Tom");
carArray[] = new Car(, "KIMM");
carArray[] = new Car(, "fRED");
}
}
理想情况下,使用C#foreach结构迭代Garage对象中的每个子项比较方便。
static void Main(string[] args)
{
Garage carLot = new Garage();
foreach (Car c in carLot)
{ }
}
但是编译器会通知我们Garage类没有实现名为GetEnumerator()的公共定义。对象支持这种行为说明他们必须能够向调用方提供自己包含的子项。
//这个接口告知调用方对象的子项可以枚举
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
可以看到,GetEnumerator()方法返回对另一个接口IEnumerator的的引用,这个接口提供了基础设施,调用方可以用来移动IEnumerable兼容容器包含的内部对象。
//这个接口允许调用方获取容器的一个子项
public interface IEnumeratoe
{
bool MoveNext();
object Current { get; }
void Reset();
}
如果想修改Garage类来支持这些接口,我们可以手工实现这些方法,但是这很麻烦。虽然自己开发GetEnumerator() MoveNext() Reset()也没问题,但是有一个更简单的办法。因为System.Array类型和许多其它的类型都已经实现的IEnumerable和IEnumerator接口,我们可以简单委托请求到System.Array,如下所示
public class Garage:IEnumerable
{
private Car[] carArray = new Car[];
public Garage()
{
carArray[] = new Car(,"Rusty");
carArray[] = new Car(, "Tom");
carArray[] = new Car(, "KIMM");
carArray[] = new Car(, "fRED");
} public IEnumerator GetEnumerator()
{
//system.Array已经实现了IEnumerator
return carArray.GetEnumerator();
}
}
修改后,我们就可以使用foreach来遍历了。除此之外,GetEnumerator()被定义为公开的,对象用户可以与IEnumerator类型交互。
//手动与IEnumerator协作
IEnumerator i=carLot.GetEnumerator();
i.MoveNext();
car myCar=(car)i.Cuurent;
最新文章
- 【异常处理_iis】无法启动IIS Express\iisexpress.exe
- 三、jQuery--jQuery基础--jQuery基础课程--第2章 jQuery 基础选择器
- php databases support off fail zabbix
- CENTOS GUI
- 禁止生成文件Thumbs.db
- C语言练习代码
- openssl生成rsa公私钥
- Gitlab服务器搭建(For fedora23)
- perl 第十四章 Perl5的包和模块
- 读书笔记—CLR via C#委托和attribute
- 基于udp简单聊天的系统
- DataFrame数据转为list,再逐行写入Excel
- ArchLinux 无密码Samba 配置
- 『TensorFlow』命令行参数解析
- 下拉列表 通过option 改变div的内容
- Linux学习笔记15—RPM包的安装OR源码包的安装
- 编译安装spark 1.5.x(Building Spark)
- July_One_Week—linked list
- 自动化创建tornado项目
- 【PyImageSearch】Ubuntu16.04使用OpenCV3.3.0实现图像分类