这一节我们来学习集合,什么是集合呢? 集合就如同数组,用来存储和管理一组特定类型的数据对象,除了基本的数据处理功能,集合直 接提供了各种数据结构及算法的实现,如队列、链表、排序等,可以让你轻易地完成复杂的数据操作。在使用数组和集合时要先加入 system.collections命名空间,它提供了支持各种类型集合的接口及类。集合本身上也是一种类型,基本上可以将其作为用来存储一组数据对 象的容器,由于c#面向对象的特性,管理数据对象的集合同样被实现成为对象,而存储在集合中的数据对象则被称为集合元素。这里提到了接 口这个概念,它也是面向对象编程进化的重要标准,我们在这里不做过多的讲解,先注重学习集合中的对象及其使用就可以了,下面我们来学 习第一种集合:
动态数组ArrayList.ArrayList类提供了继承了IList接口。什么是继承呢?这也是面向对象语言的重要特点之一,现在你们先把它理解为, 如果一个对象继承了类或接口,那么它也具有了这个类和接口中的方法、属性,可以用这些继承的方法和属性来做相应的操作,比如:数组增 加元素没有Add()方法,但是动态数组ArrayList继承了一个增加元素有Add()方法的接口,那么当它要增加元素的时候,不仅可以用索引, 也可以用继承下来的Add()方法了。随着学习的深入,我会给大家再具体讲解继承的概念和使用继承的好处。那么下面让我们来看看动态数组 所继承的这个接口IList它有什么特性呢?
Ilist接口:定义了利用索引访问集合对象的方法,还继承了ICollection和IEnumerable接口,除实现了接口原有的方法成员外,其本身也 定义多个专门的方法成员,例如新增、移除、在指定位置插入元素或是返回特定元素在集合中所在的位置索引,这些方法主要为集合对象提供 类似数组的元素访问功能。
ILsit接口成员:add、insert、RemoveAt、Remove、contains、Clear、indexof方法,它最大的特色在于提供类 似数组索引的访问机制。
ArrayList对象是较为复杂的数组。我们可以将它看为扩充了功能的数组,但ArrayList并不等同于数组,与数组相比,它以下功能和区别是 :
1. 数组的容量是固定的,但ArrayList的容量可以根据需要自动扩充。当我们修改了ArrayList的容量时,则可以自动进行内存重新分配和 元素复制,比如往1号索引位插入n个元素,插入后,元素的索引依次向后n个位置排列,它是动态版本的数组类型。
2.ArrayList提供添加、插入或移除某一范围元素的方法。但是在数组中,只能一次获取或设置一个元素的值,如利用索引赋值。
3.ArrayList只有一维,而数组可以是多维。
4.ArrayList可以存放任何数据类型的数据,而数组只能存储同种数据类型的数据。
这种可以存放任何数据类型的机制,我们称为装箱,本节课的后半部分我会讲解到,现在大家只需要记住,无论是什么数据类型,只要添加 到动态数组中,都将转变为Object数据类型,所以在遍历Arraylist时,要定义一个Object类型的变量,用来接收遍历它的每个项的值。
如何声明一个动态数组呢?
ArrayList AL=new ArrayList( Capacity );//初始容量capacity也是可以不写的
原因就是即使不在初识化确定容量,容量不够的时候,会自动的按倍数作扩充。
接下来我们来看一下动态数组的常用属性
Capacity 获取或设置ArrayList可包含的元素数。
Count 获取ArrayList中实际包含的元素数。
IsReadOnly 获取一个值,该值表示ArrayList是否为只读。
Item 获取或设置指定索引处的元素。
动态数组的常用方法
增加元素-AL.Add(value);利用Add方法增加集合元素值
修改元素-AL[Index]=value;利用索引的方式修改元素的值
插入元素-AL.Insert(Index,value);将元素的值value,插入到第Index位置 。
删除元素-AL.Clear(); 全部删除集合中的元素
AL.Remove(value);按照集合元素值删除元素
AL.RemoveAt(Index);按照集合的元素索引删除元素
缩减容量-AL.TrimToSize();将集合的容量减少到实际元素个数的大小