集合和数据结构
前言
集合和数据结构的基本概念
列表类集合
字典类集合
队列集合类型
堆栈集合类型
散列集合
位集合
集合和数据结构的基本概念
命名空间
-
System.Collections
对象:列表/链表、位数组、哈希表、队列和堆栈 -
System.Collections.Generic
定义泛型集合的接口和类 -
System.Collections.Specialized
包含专用的集合
列表类集合
-
列表类集合类型基于IList接口,集合中的每个元素都只包含一个值
-
列表类集合类型包括:
Array
ArrayList集合类型
List集合类型
列表类集合:数组列表
ArrayList或List
用于构建复杂的数组或列表集合,始终一维
容量可根据需要自动扩充
提供添加、插入或移除某一范围元素的方法
添加、删除、查找、数据排序、拷贝和转换、元素数容量和实际数
ArrayList al = new ArrayList();
al. Add(1);
al. Insert(1,”A”);
al. Remove(3);
al. RemoveAt(2);
……
列表类集合:列表List
List
对应于 ArrayList 的泛型类
表示可通过索引访问的对象的强类型列表
该类使用大小可按需动态增加的数组实现 IList泛型接口
提供用于对列表进行搜索、排序和操作的方法
List<string> weekdays = new List<string>();
weekdays. Add("Monday");
……
weekdays. Insert(1, "Tuesday");
双向链表LinkedList
- 通用链表,提供LinkedListNode类型的单独节点
- LinkedListNode属性Previous 和Next用于访问其前后节点
- LinkedListNode属性Value用于获取节点的值
- 属性List用于获取节点所属的LinkedList
- LinkedList属性First和Last表示第一个和最后一个节点
LinkedList<int> list = new LinkedList<int>(); //创建双向链表
list.AddFirst(0); list.AddLast(8);
LinkedListNode<int> lln1 = new LinkedListNode<int>(1); //创建节点
LinkedListNode<int> lln2 = new LinkedListNode<int>(2); //创建节点
list.AddFirst(lln1); list.AddLast(lln2);
list.AddBefore(list.Last, 33); list.AddAfter(list.Last, 25);
LinkedListNode<int> mark1 = list.Find(8); //查找节点
list.AddBefore(mark1, 11);
LinkedListNode<int> node = list.First; //输出列表内容
字典类集合
字典类集合类型
基于IDictionary/IDictionary<TKey, TValue > 接口
集合中的每个元素都包含键/值对
Hashtable集合类型
Dictionary 集合类型
SortedList集合类型
SortedList<TKey, TValue>集合类型
SortedDictionary<TKey, TValue> 集合类型
哈希表Hashtable
键/值(key/value)对的集合,根据键的哈希代码进行组织
key和value键值均为object类型
每个键(key)必须是唯一的
添加后键(key)就不能更改
键(key)不能为 null 引用,但值(value)可以
字典类集合:Dictionary<TKey, TValue >
- TKey表示字典中的键的类型
- TValue表示字典中的值的类型
- 集合中的每个元素都是一个KeyValuePair<TKey, TValue>结构,由一个值及其相关联的键组成
- 提供了从一组键到一组值的映射
排序列表
-
键/值(key/value)对的集合,按键排序,可按键和索引访问
-
集合中的每个元素都是一个可作为DictionaryEntry对象进行访问的键/值对
-
添加和移除元素时,元素会按正确的排序顺序插入或移除,同时索引也进行相应的调整
SortedList<TKey, TValue>
-
泛型类,表示键/值(key/value)对的集合
-
以基于键的排序顺序维护元素,并可按照键和索引访问
-
提供了从一组键到一组值的映射
-
每个元素都是一个KeyValuePair<TKey, TValue>结构
元素对象查找的方法Contains、ContainsKey、ContainsValue、IndexOfKey和IndexOfValue
对象设置和获取的方法GetByIndex、GetKey、GetKeyList、GetValueList和SetByIndex
排序字典SortedDictionary<TKey, TValue>
SortedList<TKey, TValue>使用的内存较少
SortedDictionary<TKey, TValue>可对未排序的数据执行更快的插入和移除
SortedList list = new SortedList(); //创建List实例对象
list.Add(5, "Friday");
list.Remove(7); //使用Remove方法删除索引7位置的元素
list.RemoveAt(5); ……
SortedList<string, string> list = new SortedList<string, string>();
list.Add("txt", "notepad.exe"); ……
SortedDictionary<string, string> list = new SortedDictionary<string, string>();
list.Add("txt", "notepad.exe"); ……
- 添加元素的方法——Add;
- 删除元素的方法——Remove, Clear
- 元素对象查找方法——Contains,ContainKey,ContainValue
- Count属性——表中键/值对数目
- Keys属性——键的集合
- Values属性——值的集合
队列集合类型
-
Queue类和Queue泛型类表示对象的先进先出集合
-
存储在Queue中的对象在一端(Queue 的结尾处)插入,从另一端(Queue的开始处)移除
堆栈集合类型
Stack类和Stack泛型类表示对象的简单的后进先出非泛型集合
Stack采用循环缓冲区方式实现对象的增删
散列集合
- HashSet泛型类
- set 集合,实现 ICollection 接口和 ICollection泛型接口
- 集是一组不重复出现且无特定顺序的元素、
用于集合运算的方法:
UnionWith(并集)
IntersectWith(交集)
ExceptWith(差集)
SymmetricExceptWith(对称差集)
用于测试集合的方法:
IsProperSubsetOf、IsProperSupersetOf、IsSubsetOf、IsSupersetOf、Overlaps和SetEquals
位集合
元素为位标志的集合,其元素都是一位,而不是一个对象
BitArray 类
- 管理位值的压缩数组,其容量可通过Length属性来控制
- 使用一个整数索引(始于0)访问此集合中的元素
- 设置/获取指定索引位置的值方法Set和SetAll/Get
- 筛选运算的方法:And,Or,Xor和Not
BitVector32类
- 值类型,在堆栈上分配;而BitArray 是引用类型,在堆上分配
- 性能更高
专用集合
NameValueCollection、StringDictionary和 StringCollection 等特殊用途的集合