A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨敏Yummy 于 2013-11-3 12:38 编辑

看到枚举数跟迭代这个知识点,对IEnumerator和IEnumerable接口不是很理解。二者主要的区别是在哪儿,有什么样的应用场景呢?

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

5 个回复

倒序浏览
IEnumerable接口有一个GetEnumerator方法, 而这个方法返回的参数类型是IEnumerator
你可以理解为"人"这个接口有一个"获取手"的方法, 这个方法返回的参数类型是"手"这个接口。

我们平时使用foreach的时候,可以对数组使用foreach,之所以能够对数组使用foreach,是因为Array类继承了IEnumerable接口。
也就是说,如果自定义一个类, 如果想直接对这个类使用foreach,那么就必须让这个类继承IEnumerable接口,并实现GetEnumerator方法。

评分

参与人数 1技术分 +1 收起 理由
陈行 + 1

查看全部评分

回复 使用道具 举报
这两个接口字面上很相似,其实也有一定的关联。 
一个类A实现了IEnumerator,也就是实现Current属性,MoveNext方法,Reset方法。只要实现这些方法,这个类A就可以用foreach这种语法了。 
IEnumerable接口主要实现了GetEnumerator方法,该方法返回一个IEnumerator。一个类A实现IEnumerable接口后,调用foreach语法的时候,会自动的调用GetEnumerator方法,然后在这个IEnumerator中遍历。 
所以只要实现两者之中任意一个接口,就可以用foreach语法了。但是本质上都是对IEnumerator做foreach,只是一个是直接,一个是间接。

评分

参与人数 1技术分 +1 收起 理由
陈行 + 1

查看全部评分

回复 使用道具 举报 1 0
IEnumerable和IEnumerator两个接口的语法定义。其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。IEnumerator对象有什么呢?它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项
回复 使用道具 举报 1 0
foreach的使用需要对象包含GetEnumerator方法的公共定义,然后就是自动调用此方法获得IEnumerator对象来访问枚举数,如何获得公共定义呢,可以继承IEnumerable,也可以可以自定义迭代器,自定义迭代器就是创建一个能够返回IEnumerable或IEnumerator接口对象的成员,只要当编译器检测到迭代器,会自动生成IEnumerable或IEnumerator接口的Current属性、MoveNext和Reset方法。有点绕,总之一句话,你要想用迭代,就需要迭代器,不管你是继承接口得来的还是自定义的。上例子:
  1. class MyClass
  2.     {
  3.         static MyClass mc = new MyClass();
  4.         public virtual IEnumerator GetEnumerator()
  5.         {
  6.             //具体的实现,需要用yield语句返回一个枚举数
  7.             for (int i = 0; i < int.MaxValue; i++)
  8.             {
  9.                 yield return i;
  10.             }
  11.         }

  12.         static IEnumerable Func()
  13.         {
  14.             yield return "起来,";
  15.             yield return "不愿做驴的人们,";
  16.             yield return "把我们的肾拿去换钱。";
  17.             yield break;//发出迭代结束信号,这里也可以不加
  18.         }
  19.         static void Main(string[] args)
  20.         {
  21.             foreach (var item in Func())
  22.             {
  23.                 Console.WriteLine(item+" ");
  24.             }
  25.             foreach (var item in mc)
  26.             {
  27.                 Console.Write(item+" ");
  28.             }
  29.             Console.ReadKey();
  30.         }
复制代码
例子中2个自定义迭代器,自己注意看他们在foreach中怎么调用的。说明一个问题,foreach最后总是会自动调用变量的GetEnumerator方法。把第一个迭代器GetEnumerator改下名字,会发现下面foreach语句报错了,因为反射mc时发现没有GetEnumerator方法了当然编译器就会报错。还有GetEnumerator也可以继承自接口。

评分

参与人数 1技术分 +1 收起 理由
陈行 + 1

查看全部评分

回复 使用道具 举报 1 0
楼主 问题解决了把标题改成已解决啊  这样可以拿分哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马