技术开发 频道

.Net编程接口剖析系列之迭代器


【IT168技术文档】在上一篇文章中,我们讲了IComparable和IComparer接口,而在本篇文章中,我要给大家讲讲用于枚举元素集合的两个接口IEnumerator和IEnumerable。IEnumerator用于实现一个迭代器(相当于以前C++的文章中所说的iterator),它具备列举一个数据结构中所有元素所需要的一些方法和属性。而IEnumerable接口则用于返回一个迭代器对象,一个实现了IEnumerable的类型表示这个类型对象是可以枚举的。
    下面我们先来看看这两个接口的定义吧!

IEnumerator

     迭代器用于枚举一个数据结构中的所有元素。
namespace System.Collections
{
[ComVisible(true)]
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
{
[DispId(-4)]
IEnumerator GetEnumerator();
}
}
   从上面的定义我们可以看到,一个Emurator具备了枚举一个数据结构中所有元素的最基本能力:
   获取当前元素的的能力:Current属性;
   移动元素指针的能力:MoveNext方法; 
   重置迭代器的能力:Reset方法。
   这里的Current属性是Object类型,也就是可以返回所有类型元素,而与之对应的泛型接口是:System.Collections.Generic.IEnumerator<T>,它除了继承了Ienumerator之外,还增加了一个特定类型的Current属性。
IEnumerable 
   IEnumerable声明一个类型为可枚举的类型,而它的定义很简单,就是返回一个迭代器。
namespace System.Collections 
{
[ComVisible(true)]
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
    我们应该对C#风格的遍历语法应该很熟悉了,也就是foreach语句。说到foreach这个东西,其实在C++中也存在,但是是以函数的形式做在库里面的,而对C#来说,它已经被做到语言中去了。在绝大多数情形下,我们应该尽量使用foreach语句来遍历一个集合对象,而不是自己写一个for循环或者其他的while循环等,理由很简单:效率。而foreach语法需要被枚举的对象类型实现了IEnumerable接口。
    与IEnumerable对应的泛型接口是:System.Collections.Generic.IEnumerable<T>。
0
相关文章