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

【C#】构建可枚举类型(IEnumerable和IEnumerator)的更多相关文章

  1. C#深度学习の枚举类型(IEnumerator,IEnumerable)

    一.关于枚举的含义 .Net提供了可枚举类型的接口IEnumerable和枚举器接口IEnumerator,程序集System.Collections 另: IQueryable 继承自IEnumer ...

  2. 实现自定义集合的可枚举类型(IEnumerable)和枚举数(IEnumerator )

    下面的代码示例演示如何实现自定义集合的 IEnumerable 和 IEnumerator 接口: using System; using System.Collections; using Syst ...

  3. .net 可枚举类型的构建方法

    数组可以使用foreach遍历数组,其实只要实现GetEnumertor方法的类型都可以使用foreach结构遍历数组. 首先看下代码: //笔类 public class Pencil { publ ...

  4. IEnumerable与IEnumerator

    IEnumerable接口 IEnumerable接口:实现该接口的类,表明该类下有可以枚举的元素 public interface IEnumerable { //返回一个实现了IEnumerato ...

  5. 迭代器学习之一:使用IEnumerable和IEnumerator接口

    写博客是检验我学习的成果之一以及自我总结的一种方式,以后会经常利用这种方式进行技术交流和自我总结,其中认识不深难免会有错误,但是一直懂得不懂就问,不懂就学的道理! 1.首先看一个简单的列子 , , , ...

  6. C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield

    IEnumerable / IEnumerator 首先,IEnumerable / IEnumerator 接口定义如下: public interface IEnumerable /// 可枚举接 ...

  7. IEnumerable和IEnumerator 详解 (转)

    原文链接:http://blog.csdn.net/byondocean/article/details/6871881 参考链接:http://www.cnblogs.com/hsapphire/a ...

  8. [转]那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable

    1.首先看一个简单的例子 int[] myArray = { 1, 32, 43, 343 }; IEnumerator myie = myArray.GetEnumerator(); myie.Re ...

  9. C#的枚举数(Enumerator)和可枚举类型(Enumerable)

    数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们 ...

随机推荐

  1. tomcat 访问400 的一种情况

    tomcat 高版本对访问url做了较高的校验,如果url中包含特殊字符,tomcat会自动拦截,返回400错误.如果要包含特殊字符,需要事先进行转译. 我原来用的apache-tomcat-6.0. ...

  2. linux包安装,解压,压缩,包管理,环境变量

    linux 包安装,解压,压缩,包管理 centoscentos上有系统包管理器yum yum的配置一般有两种方式,一种是直接配置/etc目录下的yum.conf文件,另外一种是在/etc/yum.r ...

  3. http基础(1.了解web及网络基础,2.简单的http协议)

    第一章:了解web及网络基础 1.http:超文本传输协议 2.tcp/ip协议族:通常使用的网络是在tcp/ip协议族的基础上运作的,而http属于它内部的一个子集. 3.tcp/ip协议族按层次分 ...

  4. CODE FESTIVAL 2017 qual B C - 3 Steps

    Score : 500 points Problem Statement Rng has a connected undirected graph with N vertices. Currently ...

  5. Apache2.4+Tomcat7 集群

    Apache2.4+Tomcat7 集群: 1.下载并安装相对应的软件 apache下载地址:http://httpd.apache.org/ 这里使用apache2.4 tomcat下载地址:htt ...

  6. 用例图(Use Case Diagram)

    用例图(Use Case Diagram) 执行者/参与者(Actor): 表示与您的应用程序或系统进行交互的用户.组织或外部系统.用一个小人表示. 用例(Use Case): 即系统具有的功能,在用 ...

  7. 分布式实时日志分析解决方案ELK部署架构

    一.概述 ELK 已经成为目前最流行的集中式日志解决方案,它主要是由Beats.Logstash.Elasticsearch.Kibana等组件组成,来共同完成实时日志的收集,存储,展示等一站式的解决 ...

  8. 【Python学习笔记】Coursera课程《Using Databases with Python》 密歇根大学 Charles Severance——Week4 Many-to-Many Relationships in SQL课堂笔记

    Coursera课程<Using Databases with Python> 密歇根大学 Week4 Many-to-Many Relationships in SQL 15.8 Man ...

  9. 【Python学习】Jupyter解决单个变量输出问题

    使用Jupyter的时候有时候发现,我明明写了好几个变量打印,但是它只显示最后一个.Out只有一个. 但是使用下面的语句.就可以实现多个输出. from IPython.core.interactiv ...

  10. java===java基础学习(14)---封装

    package dog; public class Demo4 { public static void main(String []args) { Worker w1= new Worker(&qu ...