一、 排序场景

  • 一维数组排序
  • 多维数组排序
  • 集合排序,例如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# 排序技术研究与对比的更多相关文章

  1. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  2. ASP.NET Core技术研究-全面认识Web服务器Kestrel

    因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...

  3. Micro LED巨量转移技术研究进展

    近年来,Micro LED因其功耗低.响应快.寿命长.光效率高等特点,被视为继LCD.OLED之后的新一代显示面板技术.Micro LED的英文全名是Micro Light Emitting Diod ...

  4. <脱机手写汉字识别若干关键技术研究>

    脱机手写汉字识别若干关键技术研究 对于大字符集识别问题,一般采用模板匹配的算法,主要是因为该算法比较简单,识别速度快.但直接的模板匹配算法往往无法满足实际应用中对识别精度的需求.为此任俊玲编著的< ...

  5. 重复数据删除(De-duplication)技术研究(SourceForge上发布dedup util)

    dedup util是一款开源的轻量级文件打包工具,它基于块级的重复数据删除技术,可以有效缩减数据容量,节省用户存储空间.目前已经在Sourceforge上创建项目,并且源码正在不断更新中.该工具生成 ...

  6. 伪AP检测技术研究

    转载自:http://www.whitecell-club.org/?p=310 随着城市无线局域网热点在公共场所大规模的部署,无线局域网安全变得尤为突出和重要,其中伪AP钓鱼攻击是无线网络中严重的安 ...

  7. Azure IoT 技术研究系列2-起步示例之设备注册到Azure IoT Hub

    上篇博文中,我们主要介绍了Azure IoT Hub的基本概念.架构.特性: Azure IoT 技术研究系列1-入门篇 本文中,我们继续深入研究,做一个起步示例程序:模拟设备注册到Azure IoT ...

  8. Azure IoT 技术研究系列3-设备到云、云到设备通信

    上篇博文中我们将模拟设备注册到Azure IoT Hub中:我们得到了设备的唯一标识. Azure IoT 技术研究系列2-设备注册到Azure IoT Hub 本文中我们继续深入研究,设备到云.云到 ...

  9. Azure IoT 技术研究系列4-Azure IoT Hub的配额及缩放级别

    上两篇博文中,我们介绍了将设备注册到Azure IoT Hub,设备到云.云到设备之间的通信: Azure IoT 技术研究系列2-设备注册到Azure IoT Hub Azure IoT 技术研究系 ...

随机推荐

  1. Springmvc+Spring+Mybatis实现员工登录注册功能

    ssm实现用户注册以及登录功能..转载请标明出处  http://www.cnblogs.com/smfx1314/p/smfx1314.html 前端bootstrap 所使用的IDE是eclips ...

  2. riot.js教程【一】简介

    Riotjs简介 Riotjs是一款简单的.优雅的.组件化UI前端开发框架: 他支持自定义标签(custom tags),拥有令人愉悦的语法,优雅的API和非常小的体积: 为什么需要一个新的界面库 前 ...

  3. vb6.0快速操作注册表函数大全(仅字符串KEY值部分)

    Option Explicit '声明要加载的函数 Private Declare Function RegCreateKey Lib "advapi32.dll" Alias & ...

  4. 面向接口编程实现不改代码实现Redis单机/集群之间的切换

    开发中一般使用Redis单机,线上使用Redis集群,因此需要实现单机和集群之间的灵活切换 pom配置: <!-- Redis客户端 --> <dependency> < ...

  5. python Logging的使用

    日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分. 根据事件的轻重可分为以下几个级别: DEBUG: 详细信息, ...

  6. windows将某个应用加入开机启动项的解决办法

    找到计算机以下位置,将要加入开机启动项的程序的快捷方式直接Copy到该目录下,下次开机该程序则会自动启动 C:\Users\pc\AppData\Roaming\Microsoft\Windows\S ...

  7. Android+ESP8266+路由器实现远程控制(基于花生壳域名方式访问)

    x先说一下实现的功能,其实就是远程控制 和这篇文章的控制  http://www.cnblogs.com/yangfengwu/p/5295632.html   应该说是这篇文章的升级,解决这篇文章由 ...

  8. LeetCode 581. Shortest Unsorted Continuous Subarray (最短无序连续子数组)

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  9. LeetCode 11. Container With Most Water (装最多水的容器)

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  10. 【原创】基于禅道的Bug管理操作规范

    1. 禅道简介 禅道是一个基于"敏捷开发"模式的软件开发全生命周期管理软件,在国内的软件开发公司里占据了超过70%的份额,从大公司到小公司,都能适用. 禅道官网:http://ww ...