首页 > 代码库 > C#中的ICollection接口
C#中的ICollection接口
一、集合类:
1.1 ICollection接口
前面我们学习了数组,这是.net Framework定义的最基本的集合类型,除过数组外,.net Framework还另外定义了很多集合类型以满足编程的需要。
常见的集合有:
- 向量;
- 链表;
- 双端队列;
- 栈;
- 树;
- Hash表;
- Hash映射。
所有的这些集合类型,在.net Framework中都必须实现一个重要的接口:ICollection接口。ICollection接口为实现它的类定义了两个主要规范:
- 集合元素数量(表现为Count属性);
- 访问集合的迭代子(表现为GetEnumerator方法)。
其中,GetEnumerator方法是由ICollection的父接口IEnumerable接口继承得来的。
ICollection接口定义了一个存储和获取object类型对象引用的集合,所以可以存储和获取各种引用类型对象的引用或值类型对象。
1.2 IEnumerable接口
IEnumerable接口是ICollection的父接口,凡实现此接口的类,都具备“可迭代”的能力。
IEnumerable接口只定义了一个方法:GetEnumerator,该方法将返回一个“迭代子”对象(或称为迭代器对象),是一个实现了IEnumerator接口的对象实例。
图1 ICollection继承层次
二、迭代子
迭代子在C++中也称为迭代器,是设计模式中的迭代模式,其存在的意义为:每一种集合都具备不同的存储形式,例如向量使用数组来存储,链表使用对象和对象间的引用来存储,表采用多维数组或十字引用来保存数据,树通过对象和对象间的多个引用来建立关系,图采用树或表来保存其关系……可见不同的集合类存储数据的方式是多样化的。存储的多样性必然导致访问的多样性,集合最常用的访问是“遍历”,即从集合的头部访问到集合的尾部,我们需要想办法使用一种统一的方式来遍历访问不同形式的集合。这就是迭代方式产生的基本原因。
迭代模式将集合类看做一个容量无限的容器,并且容器的存放规则是线性的,即容器里的每一个元素都必须具有一个直接前趋(除过第一个元素)和一个直接后继(除过最后一个元素)。容器中具备一个标志,可以指向容器中的任意一个存储单位。
迭代分为两种:单向只向前迭代和双向迭代。
2.1 单向只向前迭代模式
对于单向只向前迭代模式,集合的单元标志只能从集合的某个元素起始逐一向后移动,所以最基本的迭代模式定义了三种操作:
- 访问标志所在项;
- 标志前进到下一项并判断是否到达集合末尾;
- 重新回到初始项。
图2 单向只向前迭代
2.2 双向迭代模式
对于双向迭代模式,集合的单元标志即从集合的某个元素起逐一向后移动,也可以从集合的某一个元素起逐一向前移动,所以该类型迭代器定义了四种操作:
- 访问标志所在当前项;
- 标志前进到下一项并判断标志是否到达集合末尾;
- 标志回到前一项并判断标志是否到达集合起始;
- 回到初始项。
图3 双向迭代
.net Framework使用IEnumerator接口定义了一个单向只向前迭代规范。
ICollection接口继承了IEnumerable接口,该接口定义的GetEnumerator方法可以获取到一个当前集合类对象的迭代子对象,即一个实现了IEnumerator接口的对象。
凡是实现了IEnumerable接口的类,都可以使用foreach循环迭代遍历。
IEnumerator接口定义了一个可以遍历object类型对象引用的迭代子,IEnumerable接口定义了获取这种迭代子对象的方法。
三、泛型集合
3.1 ICollection<T>接口
ICollection<T>接口定义了泛型集合接口,所谓泛型集合,即使用了.net Framework提供的泛型特性,使集合限定为只存储一种特定类型对象引用或值类型的数据的集合。泛型集合增强了集合访问的效率和安全性。
由于存储类型已被确定,所以ICollection<T>比ICollection接口提供了更多的方法,包括添加到集合,从集合删除以及判断一个对象引用(或对象值)是否在集合中存在。
3.2 IEnumerable<T>接口
ICollection<T>接口实现了IEnumerable<T>接口,主要用来返回一个实现了实现了IEnumerator<T>接口的,确定类型的迭代子对象。
参考ICollection<T>的继承关系图。
图4 ICollection<T>接口继承关系图
熟悉上述的系列接口,这是我们后面学习各种集合类对象的基础。
C#中的ICollection接口