IEnumerator 和IEnumerable,及其泛型
2015-11-07 17:17
302 查看
1.一个collection要支持foreach,即对集合中的对象进行遍历(traverse),要遍历一个集合对象则需要满足下面条件:
方案a.让这个类实现IEnumerable接口
方案b:该类拥有一个public 的GetEnumerator()实例方法
2.IEnumerator
这个接口提供2个方法,1个只读属性
3.IEnumerable
这个接口只提供了一个方法
这个方法返回一个用于循环访问集合的IEnumerator对象
4.IEnumerator versu IEnumerable
从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator对象就是一个iterator(迭代器)。
5.两者联系
IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,可以通过IEnumerable的GetEnumerator()得到IEnumerator对象
例子:(引用@RY一步一个脚印)
方案a.让这个类实现IEnumerable接口
方案b:该类拥有一个public 的GetEnumerator()实例方法
2.IEnumerator
这个接口提供2个方法,1个只读属性
public interface IEnumerator { bool MoveNext();//迭代器下移 Object current{get;}//迭代器当前的位子 void Reset();//迭代器重置复位 }
3.IEnumerable
这个接口只提供了一个方法
public interface IEnumerable { IEnumerator GetEnumerator(); }
这个方法返回一个用于循环访问集合的IEnumerator对象
4.IEnumerator versu IEnumerable
从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator对象就是一个iterator(迭代器)。
5.两者联系
IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,可以通过IEnumerable的GetEnumerator()得到IEnumerator对象
例子:(引用@RY一步一个脚印)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace IEnumeratorSample { class Person : IEnumerable { public string Name;//定义Person的名字 public string Age;//定义Person的年龄 public Person(string name, string age)//为Person初始化(构造函数) { Name = name;//配置Name值 Age = age; } private Person[] per;//Person类型的数组 public Person(Person[] array)//重载构造函数,迭代对象 { per = new Person[array.Length];//创建对象 for (int i = 0; i < array.Length; i++)//遍历初始化对象 { per[i] = array[i];//数组赋值 } } public IEnumerator GetEnumerator()//实现接口 { return new PersonEnum(per);//返回一个新的迭代器,是为了维护状态 } } class PersonEnum : IEnumerator//实现foreach语句内部,并派生 { public Person[] _per;//实现数组 int position = -1;//设置“指针” public PersonEnum(Person[] list) { _per = list;//实现list } public bool MoveNext()//实现向前移动 { position++;//位置增加 return (position < _per.Length);//返回布尔值 } public void Reset()//位置重置 { position = -1;//重置指针为-1 } public object Current//实现接口方法 { get { try { return _per[position];//返回对象 } catch (IndexOutOfRangeException)//捕获异常 { throw new InvalidOperationException();//抛出异常信息 } } } } class Program { static void Main(string[] args) { Person[] per = new Person[2] //调用构造函数 { new Person("guojing","21"), new Person("muqing","21"), }; Person personlist = new Person(per);//调用构造函数 foreach (Person p in personlist)//遍历对象 { Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age); } Console.ReadKey(); } } }
相关文章推荐
- 继《一次体验很不爽的面试经历》后深入反思
- 文件读写权限
- 我的Java学习笔记1——java执行Oracle的sql语句时报错ORA-00911无效字符错误
- 在CentOS7.0安装Orchestration模块(heat)
- Kernighan/Lin Algorithm[翻译]
- iOS开发25-iOS可视化编程-Interface Builder
- zookeeper初试
- 赫夫曼树与赫夫曼编码
- AndroidL 开机展示Keyguard锁屏机制初探
- 初学Android,字符串,数字,尺寸,数组资源(十二)
- MangoDB环境搭建与学习
- ListView的使用
- 自定义布局控件
- [深入理解Java虚拟机]第十二章 Java内存模型与线程-Java内存模型
- C++异步调用Future机制漫谈
- java注释
- ios新手如何看xcode缓存路径
- Amazon S3数据一致性模型
- 第五次课后实验
- python之函数用法execfile()