常用集合
一、数组的局限性
- 数组只能存储相同类型的数据
- 数组不能动态的扩展长度
二、什么是集合
- 集合的定义:集合原本是数学上的一个概念,表示一组具有某种性质的数学元素,引用到程序设计中表示一组具有相同性质的对象。集合好比容器,将一系列相似的组合一起,是一个特殊的类,和数组一样,可以通过索引访问集合成员,也可以通过”键”来访问,与传统数组不同的是,集合的大小可以动态调整,可以在运行时添加或删除元素
- 集合的类型:集合分为泛型集合与非泛型集合,泛型集合类一般位于System.Collections.Generic名称空间,非泛型集合类位于System.Collections名称空间。此外,System.Collections.Specialized名称空间中也包含一些有用的集合类
三、常见的集合
- 常用的非泛型集合:
类名 | 描述和用法 |
---|---|
动态数组(ArrayList) | 它代表了可被单独索引的对象的有序集合。 它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。 |
堆栈(Stack) | 它代表了一个后进先出的对象集合。 当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。 |
队列(Queue) | 它代表了一个先进先出的对象集合。 当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。 |
哈希表(HashTable) | 它使用键来访问集合中的元素。 当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。 |
集合的类成员和用法
- 动态数组(ArrayList):动态的增加和减少元素,实现了ICollection和IList和IEnumerable接口,灵活的设置数组的大小,不安全的集合类型,其元素为值类型时,效率不高(装箱和拆箱耗性能)
- ArrayList常用方法与描述:
方法名 | 描述和用法 |
---|---|
Add() | 将对象添加到ArrayList的结尾处 |
Insert() | 将元素插入ArrayList的指定索引处 |
Remove() | 从ArrayList中移除特定对象的第一个匹配项 |
RemoveAt() | 移除ArrayList的指定索引处的元素 |
Reverse() | 将整个ArrayList当中元素的顺序反转 |
Contains() | 确定某元素是否在ArrayList中 |
Clear() | 从ArrayList中移除所有元素 |
- 泛型动态数组(List):List类是ArrayList类的泛型等效类,同样实现了IList接口,IEnumrator接口和ICollection,与ArrayList不同的是,声明集合时需要声明集合内部的数据类型,即T的类型,安全的集合类型,某种情况时,在处理值类型时其处理速度比ArrayList快的多
- List常用方法与描述:
方法名 | 描述和用法 |
---|---|
Add() | 将对象添加到List的结尾处 |
Insert() | 将元素插入List的指定索引处 |
Remove() | 从List中移除特定对象的第一个匹配项 |
RemoveAt() | 移除List的指定索引处的元素 |
Reverse() | 将整个List当中元素的顺序反转 |
Contains() | 确定某元素是否在List中 |
Clear() | 从List中移除所有元素 |
IndexOf(T) | 搜索指定对象,并返回整个List中第一个匹配项的从0开始的索引 |
- 堆栈(Stack):后进先出(LIFO)的一种数据结构,本质上堆栈也是一种线性结构,线性结构的基本特点:即每个节点有且只有一个前驱结点和一个后续节点。随着像Stack中添加元素,容量通过重新分配按需自动增加,可以接受null作为有效值,不安全的数据结构,其泛型为Stack
- Stack常用方法与描述:
方法名 | 描述和用法 |
---|---|
Push() | 将对象插入Stack的顶部(入栈操作) |
Pop() | 移除并返回Stack顶部的对象(出栈操作) |
Peek() | 返回位于stack顶部的对象,但不移除 |
Contains() | 确定某元素是否在栈中 |
Clear() | 从stack中移除所有对象 |
Count | 获取栈中包含的元素数 |
- 队列(Queue):后进先出(FIFO)的一种数据结构,随着像Queue中添加元素,容量通过重新分配按需自动增加,可以通过TrimToSize来减少容量,可以接受null作为有效值,不安全的数据结构,其泛型为Queue
在A*算法中会用优先级队列处理路径节点 - Queue常用方法与描述:
方法名 | 描述和用法 |
---|---|
Enqueue() | 将对象添加到Queue的结尾处,入队 |
Dequeue() | 移除并返回位于Queue开始处的对象 |
Peek() | 返回位于Queue开始处的对象但不将其移除 |
Contains() | 确定某元素是否在Queue中 |
Clear() | 从Queue中移除所有对象 |
Count | 获取Queue中包含的元素数 |
- 字典(Dictionary<K,V>):处理和表现类似key-value的键值对的集合,Key和Value的类型由泛型指定,key值必须唯一,区分大小写。Value可以是值类型变量,也可以是对象
- Dictionary<K,V>常用方法与描述:
方法名 | 描述和用法 |
---|---|
Add(TKey, TValue) | 将指定的键和值添加到字典中 |
Clear() | 将所有键和值从 Dictionary 中移除 |
ContainsKey(TKey) | 确定 Dictionary 是否包含指定键 |
ContainsValue(TValue) | 确定 Dictionary 是否包含特定值 |
Remove(TKey) | 将带有指定键的值从 Dictionary 中移除 |
TryGetValue(TKey, TValue) | 获取与指定的键关联的值 |
Keys | 获得一个包含 Dictionary 中的键的集合 |
Values | 获得一个包含 Dictionary 中的值的集合 |
- 哈希表(HashTable):处理和表现类似key-value的键值对的集合,Key和Value都是object类型,key值必须唯一,区分大小写。Value可以是值类型变量,也可以是对象
- HashTable常用方法与描述
方法名 | 描述和用法 |
---|---|
Add() | 将指定的键和值添加到 Hashtable 中 |
Clear() | 从 Hashtable 中移除所有的元素 |
ContainsKey() | 确定 Hashtable 是否包含指定键 |
ContainsValue() | 确定 Hashtable 是否包含特定值 |
Remove() | 从 Hashtable 中移除带有指定的键的元素 |
Keys | 获取一个ICollection,包含 Hashtable 中的键 |
Values | 获取一个ICollection,包含Hashtable中的值 |
- 具体方法用法请查阅msdn:MSDN官方文档