为什么使用集合
之前有讲过数组,用来存储多个相同数据类型的集合。但是数组的长度是固定不可变的,所以在实际项目中,如果数据集需要动态添加扩充,则数组很容易饱和。且数组在操作时,如果遇到复杂的业务环境,操作起来也颇为繁琐,甚至无法实现。于是我们需要用到C#中的集合类型
集合一般是一组由类实例化的对象组成的数据集,方便统一组织和操作对象。集合的优点是
①其大小可以动态调整,这样在面对复杂的业务时,如果需要动态新增,集合也可以动态调整。
②可以存储任意类型的对象,数组在使用时会有强制类型约定,但是集合可以做到不同数据类型存储。
③集合提供了很多方法对集合中的对象进行操作。
C#中集合定义在System.Collections命名空间下。集合类型有:
今天主要讲ArrayList(动态数组)
ArrayList
ArrayList和数组非常相似,但是由于其长度可以动态调整,所以称之为动态数组。
C#中直接使用ArrayList可能会报错,此时我们需要引用命名空间。
鼠标悬停在ArrayList上面,会出现智能提示,其后点击对应的命名空间即可,一般是第一个。
点击以后,会自动将命名空间追加在类文件前面的using区
当然,using System.Collections;也可以手动写上去。
但是目前为止,VS还是业界公认的宇宙第一IDE(集成式开发环境|工具)。所以有智能提示,该用就用。
我写了一个例子,来证明ArrayList的长度是可变的,以及他可以存储任意数据类型。
上述例子,list在定义之后,输出了一次长度,长度为0.
然后使用Add()方法向其增加了一个int类型的值,然后再次输出长度,此时长度变成了1。
其后又增加了一个string类型的字符串,其后长度为2。
最后使用循环将其ArrayList中存储的数据遍历打印了一遍。
ArrayList的属性
ArrayList中最常用的属性就是Count。用来获取集合中的实际包含的元素数量。这里的Count代表的也是ArrayList的长度,但是并不代表其在内存中开辟的空间容量。ArrayList中的容量使用属性Capacity获得。
ArrayList在定义时,可以指定容量,也可以不设定容量!
不设定容量,容量默认为0,首次容量增加为4,容量超出后,容量自动翻倍。
设定容量时,容量默认为设定值,容量超出后,容量自动翻倍。
//不设定容量。默认为0
ArrayList list = new ArrayList();
//设定容量
ArrayList list = new ArrayList(2);//设定初始容量为2
看看实际代码例子:
上述例子,未设定容量,容量初始为0。增加内容后,容量变为4。当我增加至了第五个值后,容量变为8。容量翻倍了。
再看看设定容量的例子:
初始设定容量为2。增加到第三个值时,容量变成了4。到第五个值时。容量变成了8。
注意,多余的容量,也会占用内存空间,所以无形之中加重了系统的负担。此时我们可以使用ArrayList的TrimToSize()方法来缩小容量,移除多余的空间占用。
可以看到,我调用TrimToSize()方法后,ArrayList的容量变为了5。
ArrayList的操作
ArrayList的新增很简单,调用Add()方法即可。新增加的元素会添加至ArrayList的末尾。也可以通过Insert(int index,object value)方法,将元素添加至集合中的指定索引位置(相当于插队),如果目标位置有元素占用了,则所有的元素都会向后移位。
ArrayList的访问,依旧是通过索引下标完成。
可以看到,我在给list增加第五个元素时,使用了Insert方法。将元素5新增至集合中索引为1的位置(索引从0开始,1就是第二个位置)。最终输出结果是:
1..5..2..3..4
删除元素可以使用Remove(object value)方法来删除。是根据值来删除。比如我要删除元素值为3的内容,则
也可以通过索引下标来删除RemoveAt(int index)
注意啊,RemoveAt方法传入的参数是下标,元素3的下标是2,所以这里传参数的时候传2就好了。
Clear()方法是清除ArrayList中所有的元素。调用一下所有的元素就都被删除了,这没啥好演示的。。。毕竟没有内容输出了。
ArrayList list = new ArrayList(2);
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
//清除所有
list.Clear();