一、 排序场景

  • 一维数组排序
  • 多维数组排序
  • 集合排序,例如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. java反射获取字段的属性值,以及为字段赋值等方法

    1.获取某个类的属性值 /*利用getter方法获取值(首字母大写) CjJssetDTO obj: */ String filedName = "Cj"+(i+1); Class ...

  2. springboot自定义配置源

    概述 我们知道,在Spring boot中可以通过xml或者@ImportResource 来引入自己的配置文件,但是这里有个限制,必须是本地,而且格式只能是 properties(或者 yaml). ...

  3. python 携带cookie访问网站(python接口测试post)

    最近在使用自己研究性能测试工具的时候想到,使用python向服务器不断发送数据以作为并发测试.大概情况如下: #coding=utf-8 import urllib2 import urllib im ...

  4. AspectCore.Extension.Reflection : .NET Core反射扩展库

    在从零实现AOP的过程中,难免会需要大量反射相关的操作,虽然在.net 4.5+/.net core中反射的性能有了大幅的优化,但为了追求极致性能,自己实现了部分反射的替代方案,包括构造器调用.方法调 ...

  5. 如何删除错误提交的 git 大文件

    早上小伙伴告诉我,他无法拉下代码,我没有在意.在我开始写代码的时候,发现我的 C 盘炸了.因为我的磁盘是苏菲只有 256G 放了代码就没空间了,于是我查找到了原来是我的代码占用了居然有 2000+M ...

  6. vue搭建项目前奏曲——vue-cli

    vue-cli是快速构建这个单页应用的脚手架,这个可是官方的.官方给的建议,如果你是初次尝试Vue,哪就老老实实用普通的书写引入js文件,这里牵扯太多的东西,例如webpack.Node.js.npm ...

  7. linux 下gcc生成intel汇编

    留作备忘: gcc -S -masm=intel xxxx.c 生成elf可执行文件: gcc -o xxx xxxx.s 反汇编 objdump xxx 补充: 在使用gcc 对C语言程序进行编译时 ...

  8. ThreeJS之动画交互逻辑及特效

    工作需要,研究了一下 threejs 简单逻辑动画交互方法.写了一个小示例,分享一下,挺丑的. 第一步 当然就是初始化 threejs 的渲染场景了. var camera; //相机 var sce ...

  9. 【计算机网络】 一个小白的网络层学习笔记:总结下IP,NAT和DHCP

    前言:这篇文章是学习网络层协议时候总结的笔记,前面的主要部分介绍的都是IP协议, 后半部分介绍NAT协议和DHCP协议 参考书籍 <计算机网络-自顶向下>       作者 James F ...

  10. Asp.net Api中使用OAuth2.0实现“客户端验证”

    一.实现继承自OAuthAuthorizationServerProvider的类,实现以"客户端验证"方式传入的相关认证和access_token发放. public class ...