改善C#程序的建议3:在C#中选择正确的集合进行编码
要选择正确的集合,我们首先要了解一些数据结构的知识。所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。结合下图,我们看一下对集合的分类。
集合分类
在上图中,可以看到,集合总体上分为线性集合和非线性集合。线性集合指元素具有唯一的前驱和后驱的数据结构类型。非线性集合是指具有多个前驱或后驱的数据结构类型,如:树、图。在FCL中,非线性集合实现的比较少,所以我们将会更多的讨论线性集合。
注意:由于类型安全、转型效率等方面的原因,本建议将只讨论泛型集合。
线性集合按存储方式,又分为直接存储和顺序存储。所谓直接存储是指:该类型的集合数据元素可以直接通过下标(也即index)来访问,在C#中有三种形式:Array(包括数组和List<T>),string,struct。直接存储结构的优点是:向数据结构中添加元素是很高效的,只要直接放在数据末尾的第一个空位上就可以了。它的缺点是:向集合插入元素将会变得低效,它需要给插入的元素腾出位置并顺序移动后面的元素。
string和structs虽然是直接存储结构,但它们与一般的集合定义有很大的不同,所以也不在本建议讨论之中。在直接存储的数据结构中,需要区分的是数组和List<T>的选择。再次强调一下:如果集合的数目固定并且不涉及到转型,使用数组效率高,否则就使用List<T>。
顺序存储结构,也即线性表。线性表的大小可动态的扩大和缩小,它在一片连续的区域中存储数据元素。线性表不能按照索引进行查找,它通过对地址的引用来搜索元素,为了找到某个元素,它必须遍历所有元素,直到找到对应的元素为止。所以线性表的优点是插入和删除数据效率高,而缺点是查找的效率相对来说低一些。
线性表又可以分为队列、栈以及索引群集,在C#中,分别表现为:Queue<T>,Stack<T>,索引群集又进一步泛化为字典类型Dictionary< TKey, TValue >和双向链表LinkedList<T>。
队列Queue<T>遵循的是先入先出模式,它在集合末尾添加元素,在集合起始删除元素,如图:
队列操作
根据队列的特点,可以用来处理并发命令等场景:将所有客户端的命令先入队,由专门的工作线程来执行队列的命令。在分布式中的消息队列就是一个典型的队列应用实例。
栈Stack<T>遵循的是后入先出模式,它在集合末尾添加元素,同时也在集合末尾删除元素,如图2-3:
栈操作
字典Dictionary<TKey, TValue>存储的是键值对,值在基于键的散列码的基础上进行存储。字典类对象由包含集合元素的存储桶组成,每一存储桶与基于该元素的键的哈希值关联。如果需要根据键进行值的查找,使用Dictionary<TKey, TValue>将会使搜索和检索更会快捷。
双向链表LinkedList<T>是一个类型为LinkedListNode的元素对象的集合。当我们在集合中觉得插入和删除数据很慢的时候,我们可以考虑使用链表。如果我们使用LinkedList<T>,我们会发现此类型并没有其它集合普遍具有的Add方法,取而代之的是AddAfter、AddBefore、AddFirst、AddLast等方法。双向链表中的每个节点都向前指向Previous节点,向后指向Next节点。
以上讨论了线性集合,在FCL中,非线性集合实现的不多。非线性集合分为层次集合和组集合。层次集合,如树,在FCL中就没有实现。组集合,又分为集和图。集在FCL中实现为HashSet<T>,而图在FCL中也没有对应实现。集的概念在本意上是指存放在集合中的元素是无序的且不能重复的。下图演示了集的用途:
集操作
除了上面我们提到的集合类型,还有其他几个要掌握的集合类型,它们是在实际应用中发展出来的对以上基础类型的扩展:SortedList<T>,SortedDictionary<TKey, TValue>,SortedSet<T>。它们所扩展的对应类为List<T>,Dictionary<TKey,TValue>,HashSet<T>,作用是将原本无序排列的元素,变为有序排列。
除了排序上的需求增加了上面3个集合类,在命名空间System.Collections.Concurrent下,还涉及几个多线程集合类。它们主要是:ConcurrentBag<T>对应List<T>,ConcurrentDictionary<TKey, TValue>对应Dictionary<TKey, TValue>,ConcurrentQueue<T>对应Queue<T>,ConcurrentStack<T>对应Stack<T>。如果我们的集合被用于多线程应用中,可以使用这几个集合类型。关于集合的线程安全性,可以进一步查看MSDN。
本建议到此为止已经介绍了FCL中的大部分泛型集合类,为了对它们有更好的了解,最后我们给出一个主要集合类的类图。实际工作中,应该根据需要选择合适的集合类。
FCL集合类图
相关文章:

Python工程师求职必知的经典面试题
最近几年,学习Python语言的同学越来越多,学成之后大家对于后期的面试都遇到了很多难题,小编这次为大家整理了一份关于Python工程师求职必知的经典面试题!希望能够帮助到正在找Python工作的同学们。 Python工程师求职必知的经典面试题…

LeetCode实战:二叉树中的最大路径和
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Given a non-empty binary tree, find the maximum path sum. For this problem, a path i…

为Visual Studio添加配色方案
看到网上有一些教程,他们的代码截图,不是VS默认的白底黑字,觉得挺好看,就也把自己的VS鼓捣了一把: 使用的是现成的配色方案,试了好几种,就觉得这个看着舒服son-of-obsidian.vssettings 你可以去…

黑色星期五阿里云向海淘输出双11技术
本文讲的是"黑色星期五"阿里云向海淘输出双11技术【IT168资讯】11月27日零点,“黑色星期五”正式到来,虽然远在中国的消费者无法参与海外的实体抢购,但电商平台却给了他们从地球另一端参与“大抢购”的机会。随着近年海淘市场的不断…

专业的java培训机构是否靠谱,对比一下就知道了!
java在IT行业的火热是有目共睹的,所以市面上有很多机构都抓住了这点,开设了java培训课程,想要找到一个适合自己的java培训机构,多进行对比就知道了! 专业的java培训机构是否靠谱,对比一下就知道了!专业的Java培训机构靠…

LeetCode实战:环形链表 II
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Given a linked list, return the node where the cycle begins. If there is no cycle, re…

.NET中使用OracleHelper
以前一直使用MSSQL,数据库操作类也是自己写的.现在项目使用Oracle,数据库操作类用的是MICROSOFT的DAAB中的OracleHelper.实际使用过程中,发现坛内少有此方面使用经验的贴子,故在这里把我使用中的一点经验用几个例子说明一下,希望起到抛砖引玉的作用. 查询数据方面: 1.简单的SQL…

新勒索软件DynA-Crypt不仅要加密你的文件,而且窃取并删除它们
本文讲的是新勒索软件DynA-Crypt不仅要加密你的文件,而且窃取并删除它们,一个名为DynA-Crypt的新勒索软件被GData公司的恶意软件分析师Karsten Hahn发现,DynA-Crypt不仅能加密你的数据,而且试图从受害者的计算机窃取大量信息。虽然…

【Postman】6 Postman 发送post请求-Json格式
一、post请求说明 使用postman发送一个post请求,在上文中测试流程中提到的4个要素:URL、请求方式、请求头部信息及body数据。 body中设置的请求参数,常见的有如下三种: 1、x-www-from-urlencoded格式 2、form data格式 3、Json格式…

LeetCode实战:最小栈
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Design a stack that supports push, pop, top, and retrieving the minimum element in co…

配置国内 Docker Registry Mirror
由于国内特殊的网络环境,往往我们从Docker Hub中拉取镜像并不能成功,而且速度特别慢。 那么我们可以给Docker配置一个国内的registry mirror,当我们需要的镜像在mirror中则直接返回,如果没有则从Docker Hub中拉取。是否使用regist…

Java培训深度学习都要学什么
java的知识点有很多,如果是有java基础的同学,进行深度学习是非常有必要的,比较职场技能更新迭代非常的快,那么java培训深度学习都要学什么呢?来看看下面的详细介绍。 Java培训深度学习都要学什么? Java深度学习要掌握两点&#…

LeetCode实战:相交链表
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Write a program to find the node at which the intersection of two singly linked lists…

# 30 天精通 RxJS (01):认识 RxJS
RxJS 是笔者认为未来几年内会非常红的 Library,RxJS 提供了一套完整的非同步解决方案,让我们在面对各种非同步行为,不管是 Event, AJAX, 还是 Animation 等,我们都可以使用相同的 API (Application Programming Interface) 做开发…

ThickBox 3.1参数详解(转)
前几天写了一篇关于ThickBox 3.1的文章:今天在使用这个东西的时候发现里面有许多参数没有详细解释,今天抽空整理出来,现和大家分享一下:先说几个参数:class"thickbox" 调用特效;height 打开页面的…

最新Java培训-NIO实战教程
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。NIO可以理解为非阻塞IO,传统的IO的read和write只能阻塞执行,线程在读写IO期间不能干其他事情,比如调用socket.read()时&am…

获取执行SQL语句的返回结果
最近遇到的问题,在存储过程中需要拼接动态SQL语句,用变量保存,可直接使用EXECUTE SP_EXECUTESQL是不能获取想要的结果的 于是经过baidu了一番后,找到了解决的办法 declare coun int,sql nvarchar(2000)setsqlselect councount(*) …

Word文档使用密码加密
Word文档使用密码加密 方法如下: 文件-->信息-->保护文档-->用密码进行加密-->设置密码

LeetCode实战:反转链表
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Ou…

【UI设计培训】字体设计-偏旁部首变形
UI设计培训中字体设计也是非常重要的一节课,字体在UI设计岗位中可以说用到的频率是非常高的,是设计师必须学会并且要有娴熟运用的一项必备技能,在进行汉字设计的时候,可以把汉字拆分成几个偏旁部首的形式进行设计,这样…

【转帖】如何通过 javascript 访问 GridView/DataGrid 选中 CheckBox 行各列的值
功能需求1, 单击 checkbox 返回当前行值2, 外部按钮获取所有选择行的值实现说明参见主要代码,代码为自说明式。原文地址:http://www.cnblogs.com/Jinglecat/archive/2007/07/15/818967.html主要代码 <asp:GridView ID"GridView1" runat&q…

LeetCode实战:删除链表中的节点
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Write a function to delete a node (except the tail) in a singly linked list, given on…

Facebook将React的许可改为MIT
Facebook决定将React原先的BSDPatents许可改为MIT,这样其他公司就可以将React包含在Apache基金会的项目当中,并消除与开源社区之间关系的不确定性。\\Facebook的一位工程主管Adam Wolff声称,将会有越来越多的项目使用MIT许可代替BSDPatents&a…

Java培训进阶书籍推荐,赶快收藏起来!
最近有很多学习或者已经在工作的java技术的同学都想要更进一步的提升自己,那么阅读书籍可以给大家带来帮助,今天,小编将分享过去几年中一些最好的Java培训进阶书籍,您可以在2021年阅读这些书籍,以更好地学习Java和相关…

LeetCode实战:二叉搜索树的最近公共祖先
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given …

[转载] 杜拉拉升职记——02 单相思与性骚扰
来源:李可. 杜拉拉升职记(第三版). 西安: 陕西师范大学出版社, 2010, 5. 02 单相思与性骚扰的区别 拉拉注意到,DB所有经理办公室沿走道的这一面,都是用大块的玻璃来做间隔墙。 拉拉问海伦:“这么设计是为了美观吗?” …

走进云计算与虚拟化的底层核心
本文讲的是走进云计算与虚拟化的底层核心,2012年3月在国务院政府工作报告附录部分中,政府对云计算给出了官方的解释,体现了政府对云计算产业的高度重视和美好愿景。云计算在工作报告中是这样定义的:“云计算是基于互联网的服务的增加、使用和…

LeetCode实战:LRU缓存机制
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Design and implement a data structure for Least Recently Used (LRU) cache. It should …

探索性测试,笔记二
测试十戒律: 1、你应该使用大量输入,来反复锤炼被测的应用程序 *大规模的随机测试(自动化),而且有助于理解输入和输出的关系 2、你应当贪图你的邻居的应用程序 3、你应当亲自寻找睿智的预言家 *对应的输入是否有对应的…

python 监控windows磁盘空间和备份大小
#!/usr/bin/env python # Version 3.5.2 # __auth__ 无名小妖 import os import time import sendmail import psutil import collectionsdisk_used collections.OrderedDict() cur_time time.time() # current_day cur_time - cur_time % 86400 root_dir ["D:\\bac…