C#集合和数据结构
- System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表/链表、位数组、哈希表、队列和堆栈)的集合
System.Collections.Generic命名空间:
- 所有集合都直接或间接基于ICollection接口
- 列表类集合类型: 集合类型基于 IList 接口,集合中的每个元素都只包含一个值。列表类集合类型包括:Array, ArrayList, List<T>.
ArrayList或List<T>用于构建复杂的数组或列表集合。相对于Array的容量固定性,ArrayList或List<T>的容量可根据需要自动扩充。ArrayList或List<T>还提供添加、插入或移除某一范围元素的方法
- ArrayList列表类型的主要成员:。
用于添加元素对象的方法Add、AddRange、Insert和InsertRange
用于删除元素对象的方法Remove、RemoveAt、RemoveRange和Clear
用于元素对象查找的方法IndexOf、LastIndexOf、Contains和BinarySearch
用于数据排序的方法Sort和Reverse
用于拷贝和转换的方法Clone、CopyTo和ToArray
Capacity属性用于获取或设置可包含的元素数
Count属性用于获取实际包含的元素数
- List<T>表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索、排序和操作的方法; List<T>类是对应于 ArrayList 的泛型类。该类使用大小可按需动态增加的数组实现 IList<T>泛型接口, List<T>泛型类的主要成员:
添加元素对象的方法Add、AddRange、Insert和InsertRange
删除元素对象的方法Remove、RemoveAt、RemoveRange、RemoveAll和Clear
元素对象查找的方法BinarySearch、Contains、Exists、Find、FindAll、FindIndexFindLast、FindLastIndex、IndexOf和LastIndexOf
数据排序的方法Sort和Reverse
拷贝和转换的方法ConvertAll<TOutput>和CopyTo
Capacity属性用于获取或设置包含的元素数
Count属性用于获取实际包含的元素数
- 字典类集合类型
字典类集合类型基于IDictionary / IDictionary<TKey, TValue > 接口,集合中的每个元素都包含键/值对。字典类集合类型包括:
-
- Hashtable集合类型
- Dictionary 集合类型
- SortedList集合类型
- SortedList<TKey, TValue>集合类型
- SortedDictionary<TKey, TValue> 集合类型
1.1 Hashtable哈希表
- Hashtable表示键/值(key/value)对的集合,这些键/值对根据键的哈希代码进行组织
- Hashtable中key和value键值均为object类型
- Hashtable集合中每个键(key)必须是唯一的,并且添加后,键(key)就不能更改。键(key)不能为 null 引用,但值(value)可以.
- Hashtable主要成员如下:
添加元素对象的方法Add
删除元素对象的方法Remove和Clear
元素对象查找的方法Contains、ContainsKey和ContainsValue
拷贝和转换的方法CopyTo
Count属性用于获取包含在Hashtable中的键/值对的数目
Keys属性用于获取键的集合
Values属性用于获取值的集合
- 可以利用foreach语句和DictionaryEntry类型遍历Hashtable中每个键/值对:
1.2 字典Dictionary<tkey,Tvalue>
- Dictionary<TKey, TValue>泛型类表示键/值(key/value)对的集合。其中,TKey表示字典中的键的类型,TValue表示字典中的值的类型
- Dictionary<TKey, TValue>泛型类提供了从一组键到一组值的映射
- Dictionary<TKey, TValue>集合中的每个元素都是一个KeyValuePair<TKey, TValue>结构,由一个值及其相关联的键组成
- Dictionary<TKey, TValue>泛型类的主要成员:
添加元素对象的方法Add
删除元素对象的方法Remove、Clear
元素对象查找的方法Contains、ContainsKey和ContainsValue
Count属性获取包含在Dictionary中的键/值对的数目
Item属性获取或设置与指定的键相关联的值
Keys属性获取键的集合
Values属性获取值的集合
- 可以利用foreach语句和KeyValuePair<TKey, TValue>类型遍历Dictionary<TKey, TValue>中每个键/值对
1.3 排序列表sortedList
- SortedList表示键/值(key/value)对的集合
- SortedList<TKey, TValue>是其泛型版本,TKey表示字典中的键的类型,TValue表示字典中的值的类型
- SortedList集合中每个元素都是一个可作为 DictionaryEntry 对象进行访问的键/值对
- SortedList集合中每个键(key)必须是唯一的。键不能为 null 引用,但值可以
- SortedList类的主要成员:
添加元素对象的方法Add
删除元素对象的方法Remove、RemoveAt和Clear
元素对象查找的方法Contains、ContainsKey、ContainsValue、IndexOfKey和ndexOfValue
对象设置和获取的方法GetByIndex、GetKey、GetKeyList、GetValueList和SetByIndex
拷贝和转换的方法CopyTo
Capacity属性用于获取或设置可包含的元素数
Count属性用于获取包含的键/值对的数目
Keys属性用于获取键的集合;Values属性用于获取值的集合
1.4 泛型排序列表SortedList<TKey, TValue>
- SortedList<TKey, TValue>泛型类表示键/值(key/value)对的集合,以基于键的排序顺序维护元素,并可按照键和索引访问。其中,TKey表示字典中的键的类型,TValue表示字典中的值的类型
- SortedList<TKey, TValue>泛型类提供了从一组键到一组值的映射。SortedList<TKey, TValue>集合中的每个元素都是一个KeyValuePair<TKey, TValue>结构,由一个值及其相关联的键组成。通过键可以快速检索值。SortedList<TKey, TValue>中的每个键必须是唯一的。键(key)不能为空,但值(value)可以
- SortedList<TKey, TValue>泛型类的主要成员:
-添加元素对象的方法Add
-删除元素对象的方法Remove、RemoveAt和Clear
-元素对象查找的方法ContainsKey、ContainsValue、IndexOfKey和IndexOfValue
-Capacity属性用于获取或设置可包含的元素数
-Count属性用于获取包含的键/值对的数目
-Keys属性用于获取键的集合;Values属性用于获取值的集合
1.5 排序字典SortedDictionary<TKey, TValue>
- SortedDictionary<TKey, TValue>泛型类表示键/值(key/value)对的集合,以基于键的排序顺序维护元素。其中,TKey表示字典中的键的类型,TValue表示字典中的值的类型
- SortedDictionary<TKey, TValue>泛型类提供了从一组键到一组值的映射。SortedDictionary<TKey, TValue>集合中的每个元素都是一个KeyValuePair<TKey, TValue>结构,由一个值及其相关联的键组成。通过键可以快速检索值。SortedDictionary <TKey, TValue>中的每个键必须是唯一的。键(key)不能为空,但值(value)可以
- SortedDictionary<TKey, TValue>泛型类的主要成员:
-添加元素对象的方法Add
-删除元素对象的方法Remove和Clear
-元素对象查找的方法ContainsKey和ContainsValue
-Count属性用于获取包含的键/值对的数目
-Keys属性用于获取键的集合;Values属性用于获取值的集合
- 6队列集合类型Queue类和Queue<T>泛型类
- Queue类和Queue<T>泛型类表示对象的先进先出(FIFO,First In First Out)集合
- Queue类表示对象的先进先出(FIFO,First In First Out)集合。存储在 Queue 中的对象在一端(Queue 的结尾处)插入,从另一端(Queue的开始处)移除
- Queue类和Queue<T>泛型类的主要成员:
-queue方法将对象添加到Queue的结尾处
-Peek方法返回位于Queue开始处的对象
-Dequeue方法移除并返回位于Queue开始处的对象
-Clear方法从Queue中移除所有对象
-Contains方法确定某元素是否在Queue中
-Count属性用于获取元素的数目
以上demo,输出结果:10 20 30 40,如下图是队列操作的示意图:
1.7 HashSet<T>
//HashSet<T>泛型类是set 集合, 是一组不重复出现且无特定顺序的元素,如果添加的元素集合中已经存在,则不会添加进去,也不会报错.
//用于集合运算的方法UnionWith(并集)、IntersectWith(交集)、ExceptWith(差集)和SymmetricExceptWith(对称差集)
HashSet<int> even = new HashSet<int> { 1, 2, 4, 6, 8,9,10,1 };
//添加不重复的元素,若集合内有该元素,不添加
even.Add(6);
HashSet<int> odd = new HashSet<int> { 1, 3, 5, 7, 9,10,11 };
//并集
even.UnionWith(odd);
//排序
even = even.OrderBy(i => i).ToHashSet();
//删除元素
even.Remove(6);
//按条件删除元素
even.RemoveWhere(i => i % 2 == 0);
//CopyTo,将集合复制到一个指定的数组中,了解下
int[] numbs = new int[] { 10, 20, 30,40,50,60,70,80,90,100 };
even.CopyTo(numbs,numbs.Length-even.Count);