虽然枚举接口IEnumerable提供了一种向前迭代集合的协议,但是它们并没有提供确定集合大小、根据索引访问成员、搜索以及修改集合的机制。为了实现这些功能,.NET Core定义了ICollection、IList和IDictionary接口。这些接口都支持泛型和非泛型版本。然而,非泛型版本的存在只是为了兼容遗留代码。
ICollection 接口是 System.Collections 命名空间中类的基接口。ICollection 接口扩展 IEnumerable。
IDictionary 和 IList 则是扩展 ICollection 的更为专用的接口。
如果 IDictionary 接口和 IList 接口都不能满足所需集合的要求,则从 ICollection 接口派生新集合类以提高灵活性。
ICollection是IEnumerable的加强型接口,它继承自IEnumerable接口,提供了同步处理、赋值及返回内含元素数目的功能。
可以简单总结为:
IEnumerable<T>(和IEnumerable):提供了最少的功能支持(仅支持元素枚举)。
ICollection<T>(和ICollection):提供一般的功能(例如Count属性)。
IList<T>/IDictionary<K, V>及其非泛型版本:支持最多的功能(包括根据索引/键进行“随机”访问)。
IEnumerable接口
IEnumerable接口是ICollection的父接口,凡实现此接口的类,都具备“可迭代”的能力。
IEnumerable接口只定义了一个方法:GetEnumerator,该方法将返回一个“迭代子”对象(或称为迭代器对象),是一个实现了IEnumerator接口的对象实例。
凡是实现了IEnumerable接口的类,都可以使用foreach循环迭代遍历。
ICollection<T>
ICollection<T>是可以统计集合中对象的标准接口。
该接口可以确定集合的大小(Count),集合是否包含某个元素(Contains),复制集合到另外一个数组(ToArray),集合是否是只读的(IsReadOnly)。
如果一个集合是可编辑的,那么可以调用Add,Remove和Clear方法操作集合中的元素。
因为该接口继承IEnumerable<T>,所以可以使用foreach语句遍历集合。