泛型List<T>是最简单常用的集合类。用法类似于数组,可以用标准语法(方括号和元素索引)引用集合中的元素。List<T>类比数组灵活,避免了以下的数组限制。
-
为了改变数组大小,必须创建新数组,复制数组元素(如果新数组较小,甚至还复制不完),然后更新对原始数组的引用,使其引用新数组。
-
删除一个数组元素,之后所有元素都必须上移-一位。即使这样还是不好使,因为最后一个元素会产生两个拷贝。
-
插入一个数组元素,必须使元素下移一位来腾出空位。但最后一个元素就丢失了!List<T>集合类通过以下功能来避免这些限制。
List<T>集合类通过以下功能来避免这些限制。
- 创建List<T>集合时无需指定容量,它能随元素的增加而自动伸缩。这种动态行为当然是有开销的,如有必要可指定初始大小。超过该大小,List<T>集合 自动增大。
- 可用 Remove方法从List<T>集合删除指定元素。List<T>集合自动重新排序并关闭裂口。还可用RemoveAt方法删除List<T>集合指定位置的项。
- 可用 Add方法在List<T>集合尾部添加元素。只需提供要添加的元素,List<T>集合的大小会自动改变。
- 可用Insert方法在List<T>集合中部插入元素。同样地,List<T>集合的大小会自动改变。
- 可调用Sort方法轻松对List<T>对象中的数据排序。
注意:同数组一样用foreach遍历List<T>集合时,不能用循环变量修改集合内容。在遍历List<T>的foreach循环中不能调用Remove, Add或Insert 方法,否则会抛出InvalidoperationException。
下例展示了如何创建,处理和遍历一个List<int>集合的内容。
using System;
using System.Collections ,Generic;
..
List<int> numbers = new List<int>();
//使用Add方法填充List<int>
foreach (int number in new int[12]{10, 9,8, 7,7,6,5,10,4,3,2, 1))
{
numbers.Add(number);
}
//在列表倒数第二个位置插入一个元素
//第一个参数是位置,第二个参数是要插入的值
numbers.Insert(numbers.Count-1, 99);
//删除值是7的第一个元素(第4个元素,索引3)
numbers.Remove(7);
//删除当前第7个元素,索引6 (10)
numtbers.RemoveAt(6);
//用for语句遍历剩余11个元素
Console.WriteLine("Iterating using a for statement:");
for (int i = 0; i < numbers.Count; 1++)
{
int number = numbers[1]; //注意,这里使用了数组语法
Console.WriteLine(number);
}
//用foreach语句遍历同样的11个元素
Console .WriteLine("\nIterating using a foreach statement:");
foreach (int nunber in numbers)
{
Console .WriteLine(number);
}
代码的输出如下所示:
Iterating using a for statement:
10
9
8
7
6
5
4
3
2
99
1
Iterating using a foreach statement:
10
9
8
7
6
5
4
3
99
1
注意:List<T>集合和数组用不同的方式判断元素数量。列表是用Count属性,数组是用Length属性。