第19章 集合

集合在生活中非常普遍,例如一张好听的音乐专辑中的所有歌曲,是歌曲的集合;或者春节放假前排队购票的人们,是购票人的集合,等等。要在程序中处理类似的场景,就需要使用BCL中提供的集合类型。

本章将讲解集合的相关知识,先阐述了BCL中提供的各种基础集合类型以及集合接口。这些集合类型包括泛型集合类型和非泛型集合类型。使用泛型的好处我们已经多次强调,因此,建议尽量多地使用泛型集合类型。如果BCL中的集合类型不能满足我们的需要,还可以自己自定义一种新的集合类型。还将讲解和集合相关的其他知识,例如迭代器和LINQ to Objects。其中,使用迭代器可以为我们的自定义类型提供使用foreach语句迭代的能力;使用LINQ to Objects则可以更方便地访问集合类型。

19.1 集合接口

我们知道,接口定义了行为。BCL中有多种集合接口,因此也存在多种类型的集合,不同的集合对应了不同的应用场景。在介绍这些接口之前,我们已经了解了以下事实:

❑BCL中的集合类型分为非泛型和泛型;

❑非泛型集合的类和接口位于System.Collections命名空间;

❑泛型集合的类和接口位于System.Collections.Generic命名空间。

基本上每个非泛型集合接口都有一个泛型版本,但并非每个泛型集合接口都有对应的非泛型版本,这个例外就是ISet<T>泛型集合接口,没有对应的非泛型版本。表19-1列举了非泛型和泛型集合的接口,并给出了每个接口类型的说明。

ICollection接口是System.Collections命名空间中非泛型集合类的基接口,它继承自IEnumerable接口,从IEnumerable接口继承意味着实现该接口的实现类需要实现一个枚举器方法:GetEnumerator,该方法返回IEnumerator类型的数据。IDictionary和IList接口继承自ICollection作为更为专用的接口,其中IDictionary接口是键/值对的集合,如Hashtable类;而IList是值的集合,其成员可通过索引访问,如ArrayList类,此类集合如果与数组相比,可以认为是可变的数组。

接下来,对其中的一些主要接口的用途进行说明,并在表19-2中集中介绍。

第19章 集合 - 图1

第19章 集合 - 图2

图19-1是这些接口之间的关系。

和ICollection类似,ICollection<T>接口是System.Collections.Generic命名空间中泛型集合类的基接口,是ICollection接口的泛型版本。除了ISet<T>接口外,其他接口均为对应接口的泛型版本。图19-2是这些泛型集合接口之间的关系。

第19章 集合 - 图3

图 19-1 非泛型集合接口之间的关系

第19章 集合 - 图4

图 19-2 泛型集合接口之间的关系

IEnumerable<T>也继承自非泛型版本的IEnumerable接口,其他的泛型集合接口都直接继承自IEnumerable<T>接口。其中IList<T>、IDictionary<TKey,TValue>以及ISet<T>接口还继承自ICollection<T>接口。

[1]enumerable [i'nju:m´r´bl],意为“枚举器”。

[2]enumerator [i'nju:m´,reit´],意为“枚举数”。