我们之前介绍了数组和Array类实现的接口。数组的大小是固定的。如果元素格式是动态的,就应该使用集合类。List<T>是与数组相当的集合类。还有其它的集合类:队列、栈、链表、字典和集合。
这些集合一般来源于三个命名空间中:
①:普通可变集合类位于System.Collections.Generic中;
②:专用于特定类型的集合类位于System.Collections.Concurrent中;
③:不可变的集合类位于System.Collections.Immutable中。
列表
.NET Framewoke为动态列表提供了泛型类List<T>。在泛型List<T>中,必须为声明为列表的值指定类型。而ArrayList是一个非泛型列表,它可以将任意Object类型作为其元素。
使用默认的构造函数可以创建一个空列表,元素添加到列表后,列表的容量就会扩大为可接纳4个元素。如果添加了第5个元素,列表的大小就会被重新设置为8个元素,接下来是16个元素。也就是每一次的扩容是前一次的2倍。如果列表的容量改变了整个集合就会被重新分配到一块新的内存中。Array.Copy()方法将旧数组中的元素复制到新的数组中。
如果我们一开始就知道元素的个数了,那么我们可以自定义列表的容量:
List<int> intList = new List<int>(10);
// 还可以随时扩容,重新制定列表的容量大小
intList.Capacity =20;
当列表的容量大于实际需要的时候,我们会浪费内存,这个时候我们可以去除不必要的容量:
// 当元素个数不超过容量的90%时,可以用下面方法去除容量:
intList.TrimExcess(); // 如果元素已经占了90%以上,那么这个方法将失效!
我们使用列表的一些方法:
①、使用默认的构造函数可以创建一个空列表:
List<int> intList = new List<int>();
linList.Add(11);
linList.Add(21);
②、集合初始值设定项
var intList = new List<int>(){11,21};
③、使用List<T>类的AddRange()方法,可以一次给集合添加多个元素。例如:
类对象.AddRagne(new 对应类[]{ new 对应类(2019,“年份”),new 对应类(2020,"日期")});
④、插入元素,使用Insert()方法可以在指定位置插入元素:
// 在位置1插入元素31
intList.Insert(1,31)
// 也可以批量插入,使用InsertRange()
类对象.InsertRange((2,new 对应类(2019,“年份”)),(4new 对应类(2020,"日期"))});
⑤、访问元素,索引是从0开始的
// 获取列表第4个元素的值
var r1 = intList[3];
⑥、删除元素用RemoveAt(),它的原理是利用了IndexOf()的方法找到索引位置
// 删除第5个元素
intList.RemoveAt(4);
// 也可以批量删除元素,指定索引位置,删除后面的几位
intList.RemoveRange(2,3);
⑦、搜索
⑧、排序
⑨、类型转换