vsbutton中的集合编辑器怎么打开_编程语言中集合类对比分析,这才是选用集合类的正确打开方式...

在日常的软件项目开发的过程中,我们难免会使用到数组或者是集合相关的类,而对于C#(读作C Sharp)这门语言,关于集合的类有十多个。面对这么多的类,我们在选择的时候可能会出现下面的情形:看A好像适合,又好像不太适合;看B好像有点合适,但又感觉哪里不对劲。说到底,就是我们不知道该如何选择一个最适合我们当前应用场景的类。

如果你也出现过上面的情形,那么读完本篇文章,你将会真正学会并理解怎样选择合适的集合类,也就是能够真正做到——弱水三千,只取最合适的一瓢饮。

5d51f6ae2dc3ff562044bb56ffdf4894.png

C#中的集合

首先,为了说明的方便,我们可以简单的将上面的集合分成2个大类。第一类,可以看成是对数组功能的扩展,他们都是为了解决数组在某些方面的天生不足而创建的;第二类,可以看成键值对形式的集合,通过特定的键来存取值。

数组扩展型集合

对于数组的概念,各位Coder肯定不会感到陌生,各种编程语言(如:C、C++、C#、Java、JavaScript、Python等)都提供的数组的功能。在C#语言中,数组表示的是同种数据类型的值的集合。在实际的使用过程中,数组存在很多不足之处——比如数组的长度是固定的,为了解决这些不足,于是便通过扩展数组功能构成了下列集合类。

66dbeaef6938f0efeea9ebae9778f139.png

数组列表

1. ArrayList、List、BitArray

由于数组的长度固定,为了使其可以动态的改变长度,ArrayList应运而生。ArrayList实现了动态长度的数组,并且提供了一些非常便利的操作数组的方法。不过ArrayList存取的数据都是Object类型的,在实际的使用过程中,存在“装箱/拆箱”等影响性能的操作,于是便有了List,List是ArrayList的泛型版本,它能够指定存取数据的数据类型。因此,在实际开发编码中,更多的可以直接使用List,从而达到比ArrayList更好的性能。

至于BitArray,可以从其名称中包含Bit看出,它是专门处理位运算的。我们知道,计算机采用二进制0/1存储数据,一个二进制数就是1 bit,常说的字节是由8 bit组成。所以,对于字节数据的操作,可以使用BitArray。

2. LinkedList

无论是ArrayList还是List,内部都是使用数组对数据进行维护的,这样做有一个好处,就是查找非常简单,可以直接按照索引进行查询。但是不足的是,由于数组在内存中是连续的,那么对于插入新值和删除值变得有些麻烦,比如:将数值5插入到List正中间,需要先将正中间之后的值全部向后面移动一位,然后将5插入。如果频繁的插入和删除,那么会非常影响性能。

为了解决上面的问题,便提供了LinkedList类,该类采用了全新的数据结构——双向环状链表。双向链表结构在内存中并不是连续存在的,它使用节点保存数值,并且节点上还保存了前一个节点和后一个节点在内存中的地址,于是插入和删除操作只需要更新几个相关节点保存的内存地址即可。但有好处就必然存在不足,LinkedList查询值必须一个节点一个节点的遍历,十分麻烦。

3. HashSet

HashSet差不多就对应了数学上集合的概念,它是无序的、不重复的。可以使用该类进行数据的去重,并且使用该类进行集合的相关操作(比如:和、差、并、交)也是比较高性能的。

4. Stack、Stack

Stack表示一种叫做的数据结构,该数据结构具有FILO(first-in / last-out,即先进后出)的特点。举个例子,比如我们在家洗盘子,先洗好的盘子会放在最下面,第二洗好的放在最下面的盘子上面,然后依次堆叠,直到最后一个盘子放在最上面。在使用的时候,我们又是相反的,最先使用那个最后洗完的盘子。所以在碰到类似洗盘子这样的需求场景时使用Stack,同样的,Stack是Stack的泛型版本。

5. Queue、Queue

Queue表示一种叫做队列的数据结构,与Stack相对,队列结构具有FIFO(first-in / first-out,即先进先出)的特点。为了便于理解,同样举个例子:比如火车过隧道,第一节车厢先进的隧道,同时第一节车厢也是最先出隧道的;最后一节车厢最后进隧道,也是最后出隧道的。所以在碰到火车过隧道这样的需求场景时使用Queue,同样的,Queue是Queue的泛型版本。

键值对型集合

  除了数组类型,在编程的过程中还会遇到很多使用键值对的场景,一般而言,键是唯一的,可以通过指定的键来存取值。

3189fa3edc9620248eea077ca39601f2.png

键值对

1. Hashtable、Dictionary

Hashtable是C#语言中对于键值对这种数据结构的一种实现,他能够非常快的查询到指定键的值。但是它存取的键和值的类型都是Object类型,所以在使用的过程中一样会出现“装箱 / 拆箱”的损耗性能的操作,所以又出现了Dictionary,他是Hashtable的泛型实现,无论是键还是值都能够设定它的类型。在实际编码过程中,多使用Dictionary来取代Hashtable。

2. SortedList、SortedList

SortedList类通过它的名称我们就能够看出,它是有序的。对于存进去的数据它是按它的键进行排序的,而SortedList是SortedList的泛型实现。由于这2个类是需要按顺序排列的,所以对于元素的添加和删除操作均比Hashtable要慢。但是,相比于Hashtable与Dictionary,这2个类除了是有序之外,它们不仅能够通过键来得到值,还能使用下表索引来得到存进去的值。

3. SortedDictionary

SortedDictionary与上面的SortedList、SortedList没有太大的区别,只是对性能有所提升,因为其内部不再使用数组进行维护,而是使用一种叫做平衡二叉树的数据结构来进行维护。同时,该类不能使用下标索引来获取值。

4. ListDictionary、HybridDictionary

ListDictionary类与Hashtable最大的区别就是其内部采用了单向链表的数据结构来维护,所以在数据量比较小(最多10个元素)的情况下其占用空间较之Hashtable要小而快。但是在数据量较多的情况下,Hashtable的优势就比其强很多。

HybridDictionary类是Hashtable与ListDictionary两个类的结合体,它综合了Hashtable与ListDictionary两个类各自的优势。主要是针对未知数据量的场景,如果数据量较小,则采用ListDictionary进行维护,如果数据量较大,则采用Hashtable进行维护。

总结

不同的场景使用不同的集合类,下面对上述集合类做出总结:

  • ArrayList、List:需要使用长度不固定的数组时选用
  • LinkedList:需要频繁对集合中的数据在随机位置插入和删除时选用
  • HashSet:需要进行各种集合操作时选用
  • Stack、Stack:需要使用栈结构时选用
  • Queue、Queue:需要使用队列结构是选用
  • Hashtable、Dictionary:需要频繁根据键查找值时选用
  • SortedList、SortedList:需要根据键或者下标索引都能获取值时选用
  • SortedDictionary:该类是SortedList的性能优化版本
  • ListDictionary:键值对数量较少(最多10个)时选用
  • HybridDictionary:键值对数量未知时选用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值