代码改变世界

C#学习笔记(八):集合

2006-01-16 10:54  努力学习的小熊  阅读(1543)  评论(0编辑  收藏  举报

数组最大的限制就是一旦创建好数组,它们的大小就是固定的,不能在现有的数组末尾添加新项目,除非创建一个新的数组。

C#中的数组是作为System.Array类的实例来执行的,它们只是集合类中的一种。集合类一般用于处理对象列表,其功能要比简单数组要多,这些功能是通过执行System.Collections名称空间中的接口而实现的,因此集合的语法已经标准化了。

System.Collections名称空间中有许多接口都提供了基本的集合功能:

1IEnumerable提供了循环集合中项目的功能。

2ICollection(继承于IEnumerable)可以获取集合中项目的个数,并能把项目复制到一个简单的数组类型中。

3IList(继承于IEnumerableICollection)提供了集合的项目列表,并可以访问这些项目,以及其他一些与项目列表相关的功能。

4IDictionary(继承于IEnumerableICollection)类似于IList,但提供了可通过键码值而不是索引访问的项目列表。

System.Array类继承了IListICollectionIEnumerable,但不支持IList的一些更高级的功能,表示大小固定的一个项目列表。

System.Collections.ArrayList也执行IListICollectionIEnumerable接口,但执行的方式比System.Array更复杂。数组的大小是固定的(不能增加或删除元素),而这个类可以用于表示大小可变的项目列表。

 

可以从一个类派生自己的集合System.Collections.CollectionBase(强类型集合),CollectionBase提供了两个受保护的属性,它们可以访问存储的对象本身。List可以通过IList接口访问项目,InnerList则是用于存储项目的ArrayList对象。

在为一个集合类添加索引后,因为IList.List属性返回一个System.Object对象,所以在返回时需要进行显式数据类型转换。

    public class Animals : CollectionBase

    {

        public Animal this[int animalIndex]

        {

            get{return (Animal)List[animalIndex];}

            set{List[animalIndex] = value;}

        }

    }

这样我们就为这个索引符定义了一个类型,使用该索引符访问一个项目时,就可以得到这个类型:

animalCollection[0].Feed();

而不需要读取出项目后在进行相应的类型转换:

((Animal)animalCollection[0]).Feed();