为了开始对实现既有接口的了解,我们就看一下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. 隐藏Nginx版本号

    一般来说,黑客攻击服务器的首要步骤就是收集信息,比如说你的软件版本,这些将成为下一步有针对性攻击的依据.所以说一定程度的隐藏这些信息就显得非常有必要了,本文将简单介绍如何在网络上隐藏Nginx版本号以 ...

  2. [LeetCode] 13. Roman to Integer ☆☆

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  3. iOS 网络请求--- AFNetworing的使用

    一.GET请求方式: //1.管理器 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; ...

  4. JAVA JDBC(存储过程和事务管理)

    1.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...

  5. Send Email in Robot Framework Python Using Gmail

    转载自:http://seleniummaster.com/sitecontent/index.php/selenium-robot-framework-menu/selenium-robot-fra ...

  6. 【NOIP】提高组2012 疫情控制

    [题意]n个点的树,1为根,要求删除一些点使得截断根节点和所有叶子结点的路径(不能删根,可以删叶子).有m支军队在m个点上,每时刻所有军队可以走一步,最终走到的地方就是删除的点,求最短时间. [算法] ...

  7. Quick-Cocos2dx-Community_3.6.3_Release 中 tolua++ 使用方法

    参考文章1 http://www.aichengxu.com/view/45851 参考文章2 http://blog.csdn.net/pawleft/article/details/5212744 ...

  8. 15、简述MySQL的执行计划?

    具体的Mysql的执行计划,请参考下面的链接: MySQL_执行计划详细说明

  9. position的用法与心得

    position的四个属性值: relative absolute fixed static 为了便于理解,首先创建对应的div <div class="main"> ...

  10. 448D - Codeforces

    D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes Bizon the C ...