迭代器.NET实现—IEnumerable和IEnumerator (foreach实现)
来源:互联网 发布:怎么求逆矩阵 编辑:程序博客网 时间:2024/05/18 01:36
能用foreach遍历访问的对象需要实现什么接口或声明什么方法的类型?
答案:能用foreach遍历访问的对象必须是集合或数组对象,而这些都是靠实现超级接口IEnumerable或被声明 GetEnumerator 方法的类型迭代器模式:提供了一种方法顺序访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
IEnumerable和IEnumerator两个接口都是为迭代器模式而准备的。
下面我们先看IEnumerable和IEnumerator两个接口的语法定义。
其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。
public interface IEnumerable{IEnumerator GetEnumerator(); //返回一个循环访问集合的枚举数}
IEnumerator对象有什么呢?它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。那么让我们看看IEnumerator接口有定义了什么东西。
public interface IEnumerator{ object Current //获取集合中的当前元素{get;}//将枚举数推进到集合的下一个元素。bool MoveNext(); void Reset();}
IEnumerator接口定义了一个Current属性,MoveNext和Reset两个方法,这是多么的简约。既然IEnumerator对象是一个访问器,那至少应该有一个Current属性,来获取当前集合中的项吧。
MoveNext方法只是将游标的内部位置向前移动(就是移到一下个元素而已),要想进行循环遍历,不向前移动一下怎么行呢?
Reset方法 恢复初始化指向的位置,该位置位于集合中第一个元素之前。
再看foreach运行时 编译器在里面做了什么工作?
迭代器模式在访问数组、集合、列表数据时,尤其是数据库数据操作时,是非常普遍的应用,但由于它太普遍了,所以在各种高级语言都对他进行了封装,多以反而给人的感觉是此模式本身不太常用了。
0 0
- 迭代器.NET实现—IEnumerable和IEnumerator (foreach实现)
- 实现IEnumerable和IEnumerator接口以支持foreach语句
- 如何自己实现IEnumerable和IEnumerator接口以支持foreach语句
- 如何自己实现IEnumerable和IEnumerator接口以支持foreach语句
- 如何实现IEnumerable<T>和IEnumerator接口,一个ASP.NET MVC日志模型的实现
- c#实现Foreach枚举_IEnumerable和IEnumerator
- C# IEnumerable和IEnumerator的区别,如何实现
- C# IEnumerable和IEnumerator的区别,如何实现
- 一个类型要想支持foreach则必须实现IEnumerable,IEnumerator两个接口。
- c#:自定义泛型栈实现 IEnumerable IEnumerator
- 实现IEnumerator 已支持foreach
- c#中foreach与接口IEnumerator和IEnumerable
- foreach/yield语句自定义IEnumerable和IEnumerator类型
- c#中foreach与接口IEnumerator和IEnumerable
- Linq与where实现查询(Linq to Entity)【IEnumerable与IEnumerator与IList】|自己实现foreach的功能
- 迭代器,IEnumerator和IEnumerable的关系
- 笔记:IEnumerable和IEnumerator(包括泛型版)
- 笔记:IEnumerable和IEnumerator(包括泛型版)
- nginx + lua 白名单机制
- Spark代码总结(1)
- Android高手进阶教程(四)之----Android 中自定义属性(attr.xml,TypedArray)的使用!
- Java中判断字符串是否为数字的五种方法
- 《Windows核心编程》---Windows服务
- 迭代器.NET实现—IEnumerable和IEnumerator (foreach实现)
- 明明导入button 包 还是报错 的解决方法~
- 用CXF编写基于spring的web service
- I2C总线-I2C总线线路电气属性
- order by两个字段双重排序
- stl之hash_multimap
- 压力测试中JVM内存暴涨原因分析实战
- poj 2352 数星星 树状数组
- C++求解最大子矩阵之和