C#的集合类(数据结构)

本文由本人简书搬迁至此,并做小幅修改。

先上 C#官方文档

.NET Framework 提供了一些常用的、标准的 集合类(数据结构)
它们被定义在以下命名空间中。
!###注意###,Unity目前(2017.3.1f1)稳定运行在.net3.5环境中, 所以.net3.5以上功能基本上暂时不可用。

Unity C#版本

一、System.Collections

该命名空间包含 定义了各种对象,如列表、 队列、 位数组、 哈希表、字典集合的接口和类。

1.BitArray
简述:位数组。管理位值的压缩数组,这些值以布尔值的形式表示,其中 true 表示此位为开 (1),false 表示此位为关 (0)。

2.ArrayList
简述:相当于可变长数组。
结构:线性表。
排序:不保证排序但支持调用Sort排序。
访问方式:通过整数索引访问,索引从0开始。
元素有效性:接受 null 作为有效值,允许重复的元素。
操作效率(不考虑容量改变):
IndexOf是线性搜索,为O(n);
this[index]为O(1);
Add为O(1);
Insert为O(n);
Remove或RemoveAt是线性搜索,为O(n) 。

3.Hashtable
简述:表示根据键的哈希代码进行组织的键/值对的集合。元素类型是DictionaryEntry
结构:哈希表(散列存储)。
排序:不支持排序。
访问方式:通过键值访问。可通过foreach遍历。
元素有效性:key不能为null,value可为null。key不允许重复,value可以重复。
操作效率(不考虑容量改变):
this[key]为O(1);
Add为O(1);
Remove为O(1)。

4.Queue
简述:队列。表示对象的先进先出, 后进后出集合。
结构:线性表。
排序:不支持按值排序,因为本身存在队列顺序。
访问方式:不支持随机访问,只能先进先出, 后进后出。
元素有效性:接受 null 作为有效值,并允许重复的元素。
操作效率(不考虑容量改变):
Enqueue为O(1);
Dequeue为O(1);
Peek为O(1);

5.Stack
简述:栈。表示对象的先进后出, 后进先出集合。
结构:线性表。
排序:不支持按值排序,因为本身存在栈顺序。
访问方式:不支持随机访问,只能先进后出, 后进先出。
元素有效性:接受 null 作为有效值,并允许重复的元素。
操作效率(不考虑容量改变):
Push为O(1);
Pop为O(1);
Peek为O(1);

6.SortedList
简述:有序列表(键有序)。元素类型是DictionaryEntry
结构:线性表?()。
排序:元素加入后,按key自然排序。
访问方式:既可按照键访问,也可按索引访问。
元素有效性: key不能为null,value可为null。key不允许重复,value可以重复。
操作效率(不考虑容量改变):
IndexOfKey使用二进制搜索算法,因此为O(log n);
IndexOfValue使用线性搜索,因此为 O(n);
Add 添加未排序数据为O(n),列表末尾添加为O(log n)。
Remove或RemoveAt为O(n)。

二、System.Collections.Generic

该命名空间包含定义泛型集合的接口和类,用户可以使用泛型集合来创建 强类型 集合,这种集合能提供比非泛型强类型集合更好的类型安全性和性能。
为什么后者有更好的类型安全性和性能?
因为:
前者,集合中的元素是 Object
后者,集合中的元素是 泛型
通过Object集合创建的是弱类型集合,类型转换发生在运行时,如果目标类型是值类型,就需要装箱和拆箱。所以它的类型安全性较差,性能较低。
通过泛型集合创建的是强类型集合, 在编译阶段就能够确定类型。所以它的类型安全性较好,性能较高。
实际编程中,最常用的主要就是 System.Collections 和 System.Collections.Generic这两个命名空间。甚至, Unity2017 在创建C#脚本时默认using了这俩。

1.List<T>
System.Collections命名空间下 ArrayList 的泛型实现,特点与之相同。

2.Dictionary<TKey, TValue>
System.Collections命名空间下 Hashtable 的泛型实现,特点与之相同。
不同的是,通过foreach遍历时,元素类型是 KeyValuePair<TKey, TValue>

3.Queue<T>
System.Collections命名空间下 Queue 的泛型实现,特点与之相同。

4.Stack<T>
System.Collections命名空间下 Stack 的泛型实现,特点与之相同。

5.HashSet<T>
简述:哈希集合。存放唯一元素的集合,可进行数学集合运算, 这个集合被NRatel忽略了两三年【捂脸】,实际上可用于 “只当做一个pool,或者说用字典的话显得key比较多余” 时, 非常好用。
结构:哈希表(散列存储)。
排序:不支持排序。
访问方式:不需要索引取值,不需要Find(因为值不唯一不重复) 。可通过foreach遍历,元素类型是T。
元素有效性: 元素允许为null,但不允许重复。
操作效率(不考虑容量改变):
Add为O(1);
Remove为O(1);

6.LinkedList<T>
简述:双向链表。表示双重链接列表
结构:线性表。
排序:不支持直接排序。
访问方式:不需要索引方式取值。可通过foreach遍历,元素类型是T。
元素有效性: 元素允许为null,并允许重复的值。如果 LinkedList<T> 为空, FirstLast 属性包含 null
操作效率(不考虑容量改变):
AddAfter、AddBefore、AddFirst、AddLast为O(1);
Find查找值对应的Node是线性搜索,为O(n);
First、Last为O(1);
Remove(T)是线性搜索,为 O (n);
Remove(LinkedListNode<T>),为O(1);
RemoveFitst、RemoveLast,为O(1);

7.SortedList<TKey, TValue>
System.Collections命名空间下 SortedList 的泛型实现,特点与之相同。
不同的是,通过foreach遍历时,元素类型是 KeyValuePair<TKey, TValue>

8.SortedDictionary<TKey, TValue>
简述:有序字典(键有序)。元素类型是 KeyValuePair<TKey, TValue>
结构:二叉树。
排序:元素加入后,按key自然排序。
访问方式:通过键值访问。可通过foreach遍历。
元素有效性: key不能为null,value可为null。key不允许重复,value可以重复。
操作效率(不考虑容量改变):
this[key]为O(log n);
TryGetValue为O(log n);
Add 为O(log n);
Remove 为O(log n)。

9.SortedSet<T> (.Net 4.0及以上,Unity(.Net3.5)中不包含,不可用)
10.SynchronizedCollection<T> (.Net 3.0及以上,但Unity(.Net3.5)中不包含,不可用)
11.SynchronizedKeyedCollection<K, T>(.Net 3.0及以上,但Unity(.Net3.5)中不包含,不可用)
12.SynchronizedReadOnlyCollection<T>(.Net 3.0及以上,但Unity(.Net3.5)中不包含,不可用)

三、System.Collections.Concurrent (.NET 4.0 及以上)

该命名空间提供多个线程安全集合类。当有多个线程并发访问集合时,应使用这些类代替 System.Collections 和 System.Collections.Generic 命名空间中的对应类型。
但是,通过当前集合实现的实例之一访问的成员(包括扩展方法)不保证是线程安全的,可能需要由调用方同步。

四.System.Collections.ObjectModel

该命名空间包含可用作集合的对象模型的可重用的库中的类。在属性或方法返回集合时使用这些类。

五.System.Collections.Specialized

该命名空间包含专用和强类型集合; 例如,链接的表词典、 位向量和集合,其中包含仅字符串。



https://docs.microsoft.com/zh-cn/dotnet/standard/collections/

猜你喜欢

转载自blog.csdn.net/NRatel/article/details/83663261