C# 排序技术研究与对比
一、 排序场景
- 一维数组排序
- 多维数组排序
- 集合排序,例如Dictionary ,List<T>, 自定义类集合排序等
- DataTable排序
二、 排序实现和测试
1. 一维数组排序
1.1 一维数组排序特点
元素之间是一维线性的关系,每个元素只有一个下标,在排序场景下,每个元素的数据类型是一致的。例如:

1.2 C# 一维数组排序实现
A:调用Array.Sort方法实现数组排序,不限制元素数据类型,底层基于对IComparable的接口实现

B:使用Linq实现排序

1.2 测试结果对比
|
1000条数据(GUID) |
10000数据(GUID) |
100000数据(GUID) |
|
|
Array.Sort |
2ms |
35ms |
420ms |
|
Linq |
4ms |
74ms |
738ms |
可以看出, Array.Sort排序优于Linq的性能(越底层的结构,排序的性能越好)。
2. 多维数组排序
2.1 多维数组排序特点
数组可以具有多个维度,支持多行多列,各个维度的数据类型可以不同。
在此文中,交错数组不在研究范围内,主要研究的是不同数据类型的矩阵数组,这样更加贴近我们在实际场景中的数据。例如:

2.2 C# 多维数组排序实现
Step1:定义一个对象排序类ObjectComparer,实现IComparer接口,主要负责数组中某个列的排序,
如果要排序的列是int类型,进行如下比较即可:其他类推。

ObjectComparer类结构:

Step2:定义维度顺序整形数组:tagObjArray,实例化ObjectComparer对象,将要排序的数组作为参数传递给ObjectComparer的构造函数。

Step3:调用Array.Sort方法排序,参数:维度顺序整形数组:tagObjArray和ObjectComparer对象。

3. 集合排序
3.1.ArrayList 类
使用大小可按需动态增加的数组。

3.2 List 类
可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法,在决定使用 List 还是使用 ArrayList 类(两者具有类似的功能)时, List 类在大多数情况下执行得更好并且是类型安全的。例子中的Sort其实调用的是String.Sort方法。

3.3 List和ArrayList性能测试对比
|
ArrayList |
List |
|
|
100000 |
498 ms |
538ms |
3.4 Dictionary类/SortedDictionary类
从数据结构上来说都属于Hashtable,对关键字(键值)进行散列操作,适合键值对的存取,排序可以使用LINQ实现,建议使用SortedDictionary替换。
Dictionary和HashTable内部实现差不多,但前者无需装箱拆箱操作,效率略高一点


3.5 HashTable类
Hashtable 主要用于键值快速查找,却没有提供排序的方法,所以它的排序需要借住数组或其它集合来实现。

HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。存储桶是 HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。HashTable的优点就在于其索引的方式,速度非常快。如果以任意类型键值访问其中元素会快于其他集合,特别是当数据量特别大的时候,效率差别尤其大。
HashTable的应用场合有:对象缓存,树递归算法的替代,和各种需提升效率的场合。
3.6 Stack类
Stack,栈,表示对象的简单的后进先出非泛型集合。Push方法入栈,Pop方法出栈。
3.7 Queue类
队列,先进先出。enqueue方法入队列,dequeue方法出队列。
3.8 自定义类集合
Step1:定义自定义类:Person

Step2:构造实体类集合:List<Person> persons

Step3:排序方法实现:
1、直接排序

2、Person实现IComparable接口,直接调用Sort方法排序

直接调用Sort方法排序

3、Linq实现排序

测试结果对比:
|
1.直接排序 |
2.实现IComparable接口 |
3.Linq |
|
|
100000 |
75ms |
99ms |
29ms |
4. DataTable排序
4.1 DataTable特点
(1)DataTable 对象是按条件区分大小写的。(如果有两个 DataTable对象分别为“mydatatable”和“Mydatatable”,则搜索表的字符串被认为是区分大小写的。如果只有“mydatatable”而不存在“Mydatatable”,则该搜索表的字符串不区分大小写)。
(2)以编程方式创建 DataTable,须先通过将 DataColumn 对象添加到 DataColumnCollection(通过 Columns 属性访问)中来定义其架构。
(3)向 DataTable 添加行,须使用 NewRow 方法返回新的 DataRow 对象。(DataTable 可存储的最大行数是 16,777,216)。
(4)DataTable 也包含可用于确保数据完整性的 Constraint 对象的集合
(5)DataTable 事件(RowChanged、RowChanging、RowDeleting 和 RowDeleted)可用于确定对表进行更改的时间
4.2 DataTable排序实现
Step1: 构造DataTable

Step2:DataView排序

Step2:DataTable.Select排序

4.3 测试结果对比
|
1.DataView排序 |
2.DataTable.Select排序 |
|
|
100000 |
526 ms |
368ms |
对比下自定义类存储100000条相同数据的排序结果:
测试结果对比:
|
1.直接排序 |
2.实现IComparable接口 |
3.Linq |
|
|
100000 |
75ms |
99ms |
29ms |
三、 排序效率总结
1、 在数组排序中,建议使用Array.Sort 方式,优于LINQ方式
2、 在自定义类排序时,推荐使用LINQ方式
3、 DataTable和自定义类存储同类型数据时,自定义类的排序整体优于DataTable方式。
4、 DataTable排序时,推荐使用DataTable.Select排序方式。
5、 Dictionary和HashTable内部实现差不多,但Dictionary无需装箱拆箱操作,效率略高一点。数据量较大时,建议采用HashTable。
6、 ArrayList集合的排序性能优于List集合。
7、 Stack和Queue集合用于栈和队列操作。
C# 排序技术研究与对比的更多相关文章
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- ASP.NET Core技术研究-全面认识Web服务器Kestrel
因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...
- Micro LED巨量转移技术研究进展
近年来,Micro LED因其功耗低.响应快.寿命长.光效率高等特点,被视为继LCD.OLED之后的新一代显示面板技术.Micro LED的英文全名是Micro Light Emitting Diod ...
- <脱机手写汉字识别若干关键技术研究>
脱机手写汉字识别若干关键技术研究 对于大字符集识别问题,一般采用模板匹配的算法,主要是因为该算法比较简单,识别速度快.但直接的模板匹配算法往往无法满足实际应用中对识别精度的需求.为此任俊玲编著的< ...
- 重复数据删除(De-duplication)技术研究(SourceForge上发布dedup util)
dedup util是一款开源的轻量级文件打包工具,它基于块级的重复数据删除技术,可以有效缩减数据容量,节省用户存储空间.目前已经在Sourceforge上创建项目,并且源码正在不断更新中.该工具生成 ...
- 伪AP检测技术研究
转载自:http://www.whitecell-club.org/?p=310 随着城市无线局域网热点在公共场所大规模的部署,无线局域网安全变得尤为突出和重要,其中伪AP钓鱼攻击是无线网络中严重的安 ...
- Azure IoT 技术研究系列2-起步示例之设备注册到Azure IoT Hub
上篇博文中,我们主要介绍了Azure IoT Hub的基本概念.架构.特性: Azure IoT 技术研究系列1-入门篇 本文中,我们继续深入研究,做一个起步示例程序:模拟设备注册到Azure IoT ...
- Azure IoT 技术研究系列3-设备到云、云到设备通信
上篇博文中我们将模拟设备注册到Azure IoT Hub中:我们得到了设备的唯一标识. Azure IoT 技术研究系列2-设备注册到Azure IoT Hub 本文中我们继续深入研究,设备到云.云到 ...
- Azure IoT 技术研究系列4-Azure IoT Hub的配额及缩放级别
上两篇博文中,我们介绍了将设备注册到Azure IoT Hub,设备到云.云到设备之间的通信: Azure IoT 技术研究系列2-设备注册到Azure IoT Hub Azure IoT 技术研究系 ...
随机推荐
- jQuery Mobile 所有data-*选项,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) jQuery Mobile事件全解 jQuery Mobile 所有class选项 jQuery Mobile 所有data-*选项 jQuery Mobile 所 ...
- 【转载】WAI-ARIA无障碍网页应用属性完全展示
文章转载自 张鑫旭-鑫空间-鑫生活 http://www.zhangxinxu.com/wordpress/ 原文链接:http://www.zhangxinxu.com/wordpress/?p=2 ...
- win10 edge扩展
安装红石预览版 https://dev.windows.com/zh-cn/microsoft-edge/extensions/#available-extensions 微软翻译 鼠标手势
- JavaScript观察者模式
观察者模式观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得 ...
- Ubuntu14.04LTS下安装Node.js&NPM以及个人博客hexo的初始化配置
什么是hexo Hexo 是一款基于node 的静态博客网站生成器作者 :tommy351是一个台湾的在校大学生...相比其他的静态网页生成器而言有着,生成静态网页最快,插件丰富(已经移植了大量Oct ...
- 查漏补缺系列之dapper初体验
什么是dapper 在维护一些较老的项目的时候,往往我们会用很多sql那么这个时候我们要考虑优化这些项目的时候,我们就可以使用dapper dapper 是一款轻量级的ORM框架,它的优势很多轻量级, ...
- ubuntu软件使用汇总
ubuntu使用合集 安装Ubuntu时的硬盘分区 Linux入门(1)--Ubuntu16.04安装搜狗拼音 Linux入门(2)--Ubuntu16.04安装wineQQ Linux入门(3)-- ...
- Akka(30): Http:High-Level-Api,Routing DSL
在上篇我们介绍了Akka-http Low-Level-Api.实际上这个Api提供了Server对进来的Http-requests进行处理及反应的自定义Flow或者转换函数的接入界面.我们看看下面官 ...
- 03Vue事件
Vue提供了事件的绑定,方法写在methods对象中. 绑定dom中有两种方法: 方法一:v-on:click/dblclcick/mouseOver/mouseOut="方法名" ...
- 【JDK1.8】JDK1.8集合源码阅读——HashMap
一.前言 笔者之前看过一篇关于jdk1.8的HashMap源码分析,作者对里面的解读很到位,将代码里关键的地方都说了一遍,值得推荐.笔者也会顺着他的顺序来阅读一遍,除了基础的方法外,添加了其他补充内容 ...