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

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

1.ReadOnlyCollection 只读集合,因为List是引用传递,只用 readonly 声明后,仍然可以对其进行 Add Remove等操作,这个集合解决了这个问题。

五.System.Collections.Specialized

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



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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NRatel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值