为了开始对实现既有接口的了解,我们就看一下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;

最新文章

  1. 【异常处理_iis】无法启动IIS Express\iisexpress.exe
  2. 三、jQuery--jQuery基础--jQuery基础课程--第2章 jQuery 基础选择器
  3. php databases support off fail zabbix
  4. CENTOS GUI
  5. 禁止生成文件Thumbs.db
  6. C语言练习代码
  7. openssl生成rsa公私钥
  8. Gitlab服务器搭建(For fedora23)
  9. perl 第十四章 Perl5的包和模块
  10. 读书笔记—CLR via C#委托和attribute
  11. 基于udp简单聊天的系统
  12. DataFrame数据转为list,再逐行写入Excel
  13. ArchLinux 无密码Samba 配置
  14. 『TensorFlow』命令行参数解析
  15. 下拉列表 通过option 改变div的内容
  16. Linux学习笔记15—RPM包的安装OR源码包的安装
  17. 编译安装spark 1.5.x(Building Spark)
  18. July_One_Week—linked list
  19. 自动化创建tornado项目
  20. 【PyImageSearch】Ubuntu16.04使用OpenCV3.3.0实现图像分类

热门文章

  1. .net 跨域 问题解决
  2. 【asp.net mvc】 扩展 htmlhelper 实现分页
  3. vijos 1471 线性DP+贪心
  4. Enterprise Architect 13 : 将绘制的图形导出成图片 或者 拷贝到剪贴板中
  5. svn全备加强版
  6. 知问前端——Ajax表单插件
  7. Shuffle Cards(牛客第三场+splay)
  8. HDU 4757 可持久化trie树
  9. 【HNOI】 c tree-dp
  10. 在电脑中配置adb