List<T>
一、引言
这个类实现了IList、ICollection、IEnumerable、IList、ICollection、IEnumerable接口。
前面的章节我们也简单的提到过List泛型集合类。现在我们复习一下。
首先,数组存储的数据类型是固定的,且长度也固定不变。很显然,这种特性对不同长度的存储需求来说无法满足。固引出集合的概念,其中List为泛型集合,可以面向任何数据类型。
二、创建列表
创建列表有多种表达,可以定义长度也可以不定义。可以定义时直接赋值,也可以后面用Add()来添加。
//创建列表方法1:
var myList=new List<int>(); //创建列表,类型为int,不指定长度
myList.Capacity=10; //也可以通过属性来设置容量大小
//创建列表方法2:
List<int> myList2=new List<int>(); //创建列表,类型为int,不指定长度
myList2.Capacity=10; //也可以通过属性来设置容量大小
myList2.Add(9); //添加元素
myList2.Add(8); //添加元素
//创建列表方法3:
var myList3=new List<int>(10); //创建列表,类型为int,基础长度为10,不够则翻倍为20,再不够则翻倍为40。以此类推。
//创建列表方法4:
var myList4=new List<int>(){1,2,3}; //定义即赋值
//int[] myArray = new int[] { 1,2,3,4,5}; //普通数组定义
Console.WriteLine("myList4集合存储的元素个数为:"+myList4.Count); //输出为3
//创建列表方法5:
var myList5=new List<string>("one","two");
通过上面的例子,我们大概知道列表的创建的方法了。现有以下几点注意:
1、如果不指定列表大小或大小不够的情况下,则会根据存储数据的个数自动翻倍增加,即1、2、4、8、16。。。以此类推的翻倍。
2、列表内容超出大小后,其内部原理是将现有的T类型数组拷贝到翻倍后的新数组中。所以容量翻倍会带来一定的效率问题。
3、如果实现知道需要存储的数据大小的话,可以指定列表的大小。容量翻倍带来的性能损失问题。
4、如果不知道需要存储的数据大小的话,则尽量将容量设置大一些。这样减少容量翻倍的次数,也可以提高效率。
5、集合中可以通过Count的属性来读取现存数据的个数。
6、如果已将将元素全部添加到列表中了,且不希望添加风度哦的元素,就可以调用TrimExcess()方法,去除不需要的容量。
7、可以在集合的创建中顺便赋值。像素组一样。
三、添加元素
在二中的示例中就已经提到了,添加元素的办法。
一般而言列表添加元素有以下几个方式:
var myList = new List<int>() { 0,0,0}; //创建列表,类型为int,不指定长度
myList.Capacity=10; //也可以通过属性来设置容量大小
//添加元素方法1:
List<int> myList2 = new List<int>() { 1,2,3};//创建列表,类型为int,不指定长度,并添加元素1,2,3
myList2.Capacity=10; //也可以通过属性来设置容量大小
//添加元素方法2:
myList2.Add(9); //添加元素
myList2.Add(8); //添加元素
//添加元素方法3:
myList2.AddRange(myList); //将现有的集合添加到末尾
//添加元素方法4:
myList2.Insert(1,33); //从指定索引插入
//添加元素方法5:
myList2.InsertRange(4,myList); //从指定索引插入集合
foreach (int i in myList2)
{
Console.WriteLine(i); //遍历集合
}
四、删除元素
删除元素的方式也有多种:
//方法1:
myList2.Remove(0); //删除为值为0的第一个项
//方法2:
myList2.RemoveAt(0); //删除索引为0的项
//方法3:
myList2.RemoveRange(2,2); //删除从索引2开始长度为2的元素
//方法4:
myList2.Clear(); //删除所有元素
五、搜索元素
列表也可以搜索元素,具有如下几种方法:
//创建列表方法1:
var myList = new List<int>() {1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4}; //创建列表,类型为int,不指定长度
//方式1:
myList.IndexOf(1,0,15); //在0-15范围内搜索1的第一次出现位置索引
//方法2:
myList.LastIndexOf(3); //搜索3出现的最后一次的位置索引
//方法3:
myList.FindIndex();
//方法4:
myList.FindLastIndex();
//方法5:
myList.Find();
//方法6:
myList.FindLast();
上面的方法3到方法6中涉及到一个参数Predicate match,
其中Predicata 是个委托,该委托返回一个布尔值,并且需要将T当做参数。如果Predicata委托返回true就表示有一个匹配元素,并且找到相应的元素。
Predicate委托定义如下:
public delegate bool Predicate (T obj);