IEnumerator 和IEnumerable,及其泛型
来源:互联网 发布:was java找文件路径 编辑:程序博客网 时间:2024/05/16 13:49
1.一个collection要支持foreach,即对集合中的对象进行遍历(traverse),要遍历一个集合对象则需要满足下面条件:
方案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(); } }}
0 0
- IEnumerator 和IEnumerable,及其泛型
- IEnumerable 和 IEnumerator 接口
- IEnumerable 和 IEnumerator 接口
- IEnumerable 和 IEnumerator 接口
- IEnumerable和IEnumerator接口
- IEnumerable和IEnumerator区别
- IEnumerable和IEnumerator区别
- IEnumerator和IEnumerable区别
- IEnumerable和IEnumerator 详解
- IEnumerable和IEnumerator 详解
- IEnumerable和IEnumerator 详解 .
- IEnumerator和IEnumerable区别
- IEnumerable和IEnumerator 详解
- IEnumerable和IEnumerator 详解
- IEnumerable和IEnumerator
- IEnumerable和IEnumerator 详解
- IEnumerable和IEnumerator 详解
- IEnumerable 和 IEnumerator 接口
- 四元数的转换(一)
- 我的Java学习笔记1——java执行Oracle的sql语句时报错ORA-00911无效字符错误
- 文件读写权限
- Android监听自身卸载,弹出用户反馈调查
- 在CentOS7.0安装Orchestration模块(heat)
- IEnumerator 和IEnumerable,及其泛型
- SpringMVC @RequestBody接收Json对象字符串
- android,2048
- 开关三极管的使用误区
- XMPP客户端库Smack
- perl 自动登录盈盈理财
- MySQL存储引擎的那些事儿
- javascript笔记
- 一个简单的下载网页上图片的程序