C# 集合类型(常用集合类型整理)

一、常用集合类型及概念

1.基本关系

许多泛型集合类型均为非泛型类型的直接模拟。

Dictionary< TKey, TValue> 是 Hashtable 的泛型版本;它使用枚举的泛型结构KeyValuePair< TKey, TValue> 而不是DictionaryEntry

List< T> 是 ArrayList 的泛型版本
Queue< T>对应Queue
Stack< T>对应Stack

SortedList< TKey, TValue> 对应SortedList,这两个版本均为字典和列表的混合

SortedDictionary< TKey, TValue> 泛型类是一个纯字典,并且没有任何非泛型对应项

LinkedList< T>泛型类是真正的链接的列表,并具有任何非泛型对应项

2.常用集合类型

1)ArrayList

ArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素,相当于List < object>

2)List < T >

泛型的List 类是一个不限长度的集合类型,它内部实际就是一个数组,初始长度是4,每次数组到达限制,就会把现有容量翻倍,它提供用于对集合进行搜索、排序和操作等方法
List是数组链表,数组链表访问快,复杂度O(1),但是添加删除复杂度O(n)

3)LinkedList

LinkedList是List接口的双向链表非同步实现,并允许包括null在内的所有元素。
底层的数据结构是基于双向链表的,
LinkedList是指针链表,指针链表访问复杂度是O(n),但是添加删除很快O(1),如果对这个集合在中间的添加删除操作非常频繁的话,就建议使用LinkedList。

4)Dictionary < K, V>

存储键值对的关联性集合,查询等操作速度很快,因为它的时间复杂度是O(1)
,单线程中推荐使用Dictionary,有泛型优势,且读取速度较快,容量利用更充分.

5)Hashtable

Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对
基本概念
Hashtable使用了闭散列法来解决冲突,它通过一个结构体bucket来表示哈希表中的单个元素,这个结构体中有三个成员:
 (1) key :表示键,即哈希表中的关键字。
 (2) val :表示值,即跟关键字所对应值。
 (3) hash_coll :它是一个int类型,用于表示键所对应的哈希码。

哈希表的所有元素存放于一个名称为buckets(又称为数据桶) 的bucket数组之中
优点:
 (1)在使用哈希表保存集合元素(一种键/值对)时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。在查找时,再次通过键所对应的哈希代码到特定存储桶中搜索,这样将大大减少为查找一个元素进行比较的次数

(2)多线程程序中推荐使用Hashtable,对Hashtable进一步调用Synchronized()方法可以获得完全线程安全的类型

Dictionary< TKey, TValue> 是 Hashtable 的泛型版本,它们之间实现上区别不大,运行效率上有一些差别
Hashtable由于键值类型都object,所以涉及装箱拆箱操作,在添加数据的效率上要差一些,但是频繁使用数据时效率更高,HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。

6)SortedList

表示基于相关的 IComparer 实现按键进行排序的键/值对的集合,与哈希表类似,区别在于SortedList中的Key数组排好序的

7)堆栈(Stack)

表示对象的简单的后进先出非泛型集合。Push方法入栈,Pop方法出栈

8)队列(Queue)

队列先进先出,enqueue方法入队列,dequeue方法出队列

9)SortedList< TKey,TValue>

SortedList< TKey,TValue>是支持排序的关联性集合,将数据存储在数组中的。
  也就是说添加移除操作都是线性的,时间复杂度是O(n),因为操作其中的元素可能导致所有的数据移动。
  但是因为在查找的时候利用了二分搜索,所以查找的性能会好一些,时间复杂度是O(log n)
  所以推荐使用场景是这样地:如果你想要快速查找,又想集合按照key的顺序排列,最后这个集合的操作(添加和移除)比较少的话,就是SortedList了。
  集合中的数据是有序的。可以通过key来匹配数据,也可以通过int下标来获取数据。

添加操作比ArrayList,Hashtable略慢;查找、删除操作比ArrayList快,比Hashtable慢

#####10)SortedDictioanry< TKey,TValue>

SortedDictionary< TKey,TValue>和Dictionary< TKey,TValue>大致上是类似的,但是在实现方式上有一点点区别
  SortedDictionary< TKey,TValue>用二叉树作为存储结构的。并且按key的顺序排列
  SortedDictionary< TKey,TValue>相比于SortedList< TKey,TValue>其性能优化了
  SortedList< TKey,TValue>其内部维护的是数组而SortedDictionary< TKey,TValue>内部维护的是**红黑树(平衡二叉树)**的一种,因此其占用的内存,性能都好于SortedDictionary< TKey,TValue>
  唯一差在不能用下标取值

11)HashSet< T>

HashSet是一个无序的能够保持唯一性的集合,不支持下标访问。

12)SortedSet< T>

SortedSet内部也是一个二叉树,用来支持按顺序的排列元素。
  算法,存储结构都与哈希表相同,主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合中包含一组不重复出现且无特定顺序的元素。

13)BitArray

BitArray用于二进制运算,“或”、“非”、“与”、"异或非"等这种操作,只能存true或false;

14)ListDictionary

单向链表,每次添加数据时都要遍历链表,数据量大时效率较低,数据量较大且插入频繁的情况下,不宜选用

15)HybridDictionary

HybridDictionary的类,充分利用了Hashtable查询效率高和ListDictionary占用内存空间少的优点,内置了Hashtable和ListDictionary两个容器,添加数据时内部逻辑如下:

当数据量小于8时,Hashtable为null,用ListDictionary保存数据。

当数据量大于8时,实例化Hashtable,数据转移到Hashtable中,然后将  ListDictionary置为null。

下一篇再写一下每一种集合的内部实现,及具体的运行效率比较

我会在我的公众号上推送新的博文,也可以帮大家解答问题
微信公众号 Andy and Unity 搜索名称或扫描二维码
在这里插入图片描述
希望我们能共同成长,共同进步

  • 18
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C是一种广泛使用的编程语言,被认为是高级语言之一。相较于其他编程语言,C具有简单而又强大的特点。C语言的诞生可以追溯到1972年,由贝尔实验室的丹尼斯·里奇(Dennis Ritchie)和肯·汤普逊(Ken Thompson)联合开发。他们的目标是为了设计一个能够开发操作系统的语言,这样就诞生了C语言。 C语言适用于各种不同的应用领域,包括计算机科学、游戏开发、嵌入式系统和网络编程等。它的设计注重效率和灵活性,使得程序员能够控制内存和硬件资源的细节。C语言被广泛应用于UNIX操作系统的开发过程中。除此之外,很多其他编程语言如C++、C#、Java等也都受到了C语言的影响。 C语言具备了一定的简洁性,语法相对简单而直观,使得初学者能够比较容易地上手。它提供了丰富的操作符和库函数,能够满足不同程序的需求。然而,这也需要程序员有一定的技术基础以及对计算机底层的了解。 在学习C语言期间,我们会涉及到一些基本概念,如变量、函数、数组、指针等。这些概念是编程中的基石,掌握它们能够帮助我们更好地理解程序的运作原理。通过学习C语言,我们也能够培养我们的逻辑思维和问题解决能力。 总之,C语言是一种值得学习和掌握的编程语言。它提供了一种简洁而又强大的编程方式,能够应用于各种领域。对于初学者来说,通过学习C语言可以积累编程基础和扩展思维能力,对于专业人士来说,掌握C语言能够更好地理解底层细节和进行高效的编程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值