列表List< T>
列表List< T>实现了IList、ICollection、IEnumberable、IList接口。可以向该列表中动态的添加、删除、查找元素。如果列表中的元素满了,会动态分配一个容量是原来两倍的列表。为了避免多次重新分配内存带来的系统开销,如果事先知道所使用的列表的最大值,可以为列表预先分配足够的容量。
使用Capacity属性读取和设置容量。如果不需要添加元素,可以使用TrimExcess()方法,去掉不需要的容量。
可以使用一个已有的数组初始化列表,或者也可以使用初始值设定语法。
代码语言:javascript复制 int[] array = { 1, 2, 3, 4, 5 };
List<int> list = new List<int>();
//或者直接List<int> list = new List<int>(){ 1, 2, 3, 4, 5 };
添加元素使用Add()方法。也可以使用AddRange()方法一次性添加多个元素。
插入元素使用Insert()方法。也可以使用InsertRange()方法一次性插入多个元素。
列表实现了IList接口,而IList接口中实现了索引器。因此列表可以直接使用索引器访问元素,就像数组一样。
可以用Count属性查看列表有多少个元素。
还可以利用ForEach()方法对集合中的每一项执行一些操作。该方法的参数是一个委托:Action< T> action
。例如,输出列表中的每一个数字。
static void Main(string[] args)
{
int[] array = { 1, 2, 3, 4, 5 };
List<int> list = new List<int>(array);
list.ForEach(e => Console.WriteLine(e));
}
删除元素使用RemoveAt()方法,既可以传递下标删除指定索引处的元素,也可以传递要删除的元素。但是一般情况下前者要更高效一点,因为后者需要先定位元素然后才能删除。还可以利用RemoveRange()方法一次性删除多个元素。
常用的查找方法有IndexOf()、LastIndexOf()、FindIndex()、FindLastIndex()、Find()、FindLast()。可以使用Exists()方法查看某元素是否在集合中存在。
排序可以使用Sort()方法。重载的Sort()方法可以添加一个比较器, 以实现自定义排序。
可以使用ConvertAll()方法,将一种类型的列表转换为另外一种类型的列表。
队列Queue< T>
队列也就是先进先出(FIFO)的列表,队列实现了ICollection和IEnumberable< T>接口,但是没有实现ICollection< T>接口,因此没有Add()和Remove()方法。也没有实现IList< T>接口,因此不能使用索引器访问。
队列常用的方法和属性如下:
方法或属性 | 说明 |
---|---|
Count | 返回队列的元素个数 |
Enqueue | 该方法在队列末尾添加一个元素 |
Dequeue | 该方法返回并删除队列头的元素 |
Peek | 该方法仅返回队列头元素,不删除元素 |
TrimExcess | 该方法重新设置队列的容量,去除未使用空间 |
栈Stack< T>
栈和队列类似,不过是后进先出(LIFO)的列表。常用的方法或属性如下:
方法或属性 | 说明 |
---|---|
Count | 返回栈中元素的个数 |
Push | 将一个元素入栈 |
Pop | 将一个元素出栈并返回 |
Peek | 返回栈顶元素但不删除 |
Contains | 判断某个元素是否在栈中 |
双向链表 LinkedList< T>
前面的列表List是用数组实现的。在随机访问和想末尾添加元素时比较快。这里的链表则是在链表中间插入元素比较快。
具体方法和列表差不多。详细方法可以查看MSDN。
有序列表SortedList< TKey,TValue>
该集合存储键值对,并按键排序。注意每个键只能对应一个值。而且如果要访问的键不存在,就会抛出异常。因此可以使用Contain()方法先判断是否存在某键或者是用TryGetValue()方法尝试获取值,这样就不会发生异常。
字典Dictionary< TKey,TValue>
字典类存储键值对,内部使用散列法实现,主要用来实现键值对的高效查找。用作键的类型需要重写GetHashCode()和Equals()方法,避免在执行散列函数时出现意外情况。
集合ISet< T>
集合表示没有重复内容的Collection。常用的有无序集合HashSet< T>和有序集合SortedSet< T>。集合含有一些方法可以进行集合的交、并、差等运算。