Sort和OrderBy的定义比较

1、List.Sort()排序:
Sort并不是简单的快速排序,它对普通的快速排序进行了优化,它还结合了插入排序和堆排序。系统会根据你的数据形式和数据量自动选择合适的排序方法,这并不是说它每次排序只选择一种方法,它是在一次完整排序中不同的情况选用不同方法,比如给一个数据量较大的数组排序,开始采用快速排序,分段递归,分段之后每一段的数据量达到一个较小值后它就不继续往下递归,而是选择插入排序,如果递归的太深,他会选择堆排序。

说明:
  a. 使用Sort排序时,有可能会打破数组列表的基本顺序。在数据相同的项具有不同含义时,不能使用Sort排序;
  b. Array.Sort和List.Sort采用的是同一个排序方法。
  
2、Linq.Orderby()排序:使用快速排序,不会破坏数组列表的基本顺序。

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。《菜鸟教程》

应用示例

对于纯Int或者double类型的List,可以直接使用List.Sort()或者List.Reverse()进行升序或降序排序操作。

对于非基本类型的排序,我们先做出下面的一个示例

先创建一个自定义类型

public class Student{public double Score { get; set; }public string Name { get; set; }public int Age { get; set; }}

然后创建一个实例

List<Student> stuList = new List<Student>(){new Student(){Score = 90,Name="Tim",Age=29},new Student(){Score = 98,Name="Tom",Age=28},new Student(){Score = 98,Name="Tomi",Age=23},new Student(){Score = 82,Name="Kyle",Age=27},new Student(){Score = 76,Name="Tony",Age=26},new Student(){Score = 96,Name="moly",Age=39},new Student(){Score = 86,Name="Tkiy",Age=29},new Student(){Score = 97,Name="Vina",Age=25},new Student(){Score = 95,Name="Mike",Age=24},new Student(){Score = 95,Name="Coki",Age=29},};

一、使用OrderBy方法排序

我们先将StuList用Score排序,然后用Age排序 ,这里使用Lambda表达式

List<Student> list1 =  stuList.OrderBy(t => t.Score).ThenBy(x=>x.Age).ToList();//升序
List<Student> list1 =  stuList.OrderByDescending(t => t.Score).ThenByDescending(x=>x.Age).ToList();//降序

二、使用Sort方法排序

查看Sort的源码可以发现它有如下的几个重载:

public void Sort();
public void Sort(IComparer<T> comparer);
public void Sort(Comparison<T> comparison);
public void Sort(int index, int count, IComparer<T> comparer);
  1. 不带有任何参数的Sort方法----Sort();
  2. 带有比较器参数的Sort方法 ----Sort(IComparer)
  3. 带有比较代理方法参数的Sort方法----Sort(Comparison<(Of <(T>)>))
  4. 带有比较器参数,可以指定排序范围的Sort方法----Sort(Int32, Int32 IComparer(T))

1、实现IComparer接口

在自定义类型里实现IComparer接口,此处要注意:返回值,小于0代表x < y,等于0代表x=y,大于0代表x > y.

public class Student : IComparer<Student>{public double Score { get; set; }public string Name { get; set; }public int Age { get; set; }public int Compare(Student x, Student y){if (x.Score == y.Score && x.Age == y.Age){return 0;}else{if (x.Score.CompareTo(y.Score) > 0){return 1;}else if (x.Score == y.Score && x.Age > y.Age){return 1;}else{return -1;}}}}

调用

IComparer<Student> comparer = new Student();stuList.Sort(comparer);

2、实现IComparable接口

在自定义类型里实现IComparable接口,此处要注意:返回值,小于0代表x < y,等于0代表x=y,大于0代表x > y 只是与上面一个方法的调用形式不一样。

public class Student : IComparable<Student>{public double Score { get; set; }public string Name { get; set; }public int Age { get; set; }public int CompareTo(Student other){if (null == other){return 1;}int re = this.Score.CompareTo(other.Score);if (0 == re){return this.Age.CompareTo(other.Age);}return re;}}

调用

stuList.Sort();

3、使用Comparison委托

查看Comparison的源码可以发现,Comparison委托的定义如下:

public delegate int Comparison<in T>(T x, T y);

使用委托,可以传递一个与委托签名相同的函数,可以使用匿名委托,还可以用Lambda表达式:

使用匿名委托调用:

stuList.Sort(delegate (Student x, Student y){if (x.Score == y.Score && x.Age == y.Age){return 0;}else{if (x.Score.CompareTo(y.Score) > 0){return 1;}else if (x.Score == y.Score && x.Age > y.Age){return 1;}else{return -1;}}});

对于List的排序,也就是实现接口、使用委托,OrderBy方法,lambda表达式只是让形式更简单,并不能达到加快速度的效果。

结论:对于大数据量的数据排序,建议使用Sort()的扩展方法来实现,如果是小数据量,则直接使用OrderBy()方法更为简洁。

List排序Sort和OrderBy方法(C#)相关推荐

  1. 排序陷阱 List.Sort Linq.OrderBy

    部分内容摘自:http://www.th7.cn/Program/net/201511/692766.shtml C#框架里面主要提供了两种排序方式:Array.Sort Linq.Orderby. ...

  2. LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题

    //重复元素:3,4,5 //不重复元素:1,8,9 int[] arr = { 1, 3, 3, 3, 4, 5, 4, 5, 8, 9, 3 };//不重复元素 var unique = arr. ...

  3. C++中sort函数从大到小排序的两种方法

    1.sort函数描述 而且,sort函数的算法效率相当于快排,使用sort函数有时候可能比我们自己写一个排序算法,可能效率更高. 2.使用sort函数排序 #include <iostream& ...

  4. python列表的排序方法_pythonlist排序的两种方法及实例

    本文主要介绍了python list排序的两种方法及实例讲解.具有很好的参考价值,下面一起来看下吧 对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排 ...

  5. 按对象某属性排序的几种方法

    按对象某属性排序的几种方法: 第一种,可以实现边添加边排序,需要用到TreeSet. 第二种,用数组存放对象们,但是不需单独取出某属性排列好再重存,而是在原数组上用比较器重新排一次序.需要用到Arra ...

  6. Python编程基础:第五十四节 排序Sort

    第五十四节 排序Sort 前言 实践 前言 我们常需要对列表.元组中的元素进行排序,例如按照字母表排列学生的名称.这里就需要用到列表的sort()方法,以及sorted()函数. 实践 我们先来构建一 ...

  7. python排序的两个方法

    前言 python的排序有两个方法,一个是list对象的sort方法,另外一个是builtin函数里面sorted,主要区别: sort仅针对于list对象排序,无返回值, 会改变原来队列顺序 sor ...

  8. [转载]详细解说STL排序(sort)------这篇博文在一道题上救了我o_0

    详细解说 STL 排序(Sort) 作者Winter 原文地址:http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序 ...

  9. Python 排序 -- sort()、sorted()

    Python 排序 – sort().sorted() 1. 列表排序:sort() 函数原型: 直接对列表本身进行排序,不会返回新的列表 list.sort(cmp=None, key=None, ...

最新文章

  1. linux中编译C语言程序
  2. python: 判断字符串是否为合法的json格式
  3. [转] Freemarker的常用技巧总结
  4. [转]数据中心网络虚拟化 隧道技术
  5. ImageNet标签竟然部分有误!数据集MNIST也会出错?
  6. IntelliJ IDEA 2018 破解 汉化教程地址
  7. scala学习笔记(1)
  8. 零基础如何优雅入门“网红”Python?小白必看的MicroPython视频合集:从入门到精通!...
  9. 多功能雨伞项目计划书_共享雨伞商业计划书完整版.doc
  10. fftshift有什么用?MATLAB做FFT后为什么还要fftshift?
  11. Docker 安装(使用阿里源)
  12. 浏览器扩展插件:「油猴」使用详解 ( Tampermonkey )
  13. SCAU高级语言程序设计--实验9 函数的应用(1)
  14. 电脑硬盘分区不见了怎么恢复数据?
  15. 樱桃一次吃多少合适 这些知识一定要关心
  16. 【JavaScript 刨根问底之】requestAnimationFrame以及延时器
  17. win8.1装VHD的XP
  18. 二十四节气-小寒。文案、海报分享,小寒料峭 年味渐浓。
  19. GitHub被百万粉博主封杀!这份Java面试宝典做了什么?
  20. 满头黑发开始_python

热门文章

  1. hive 计算周几_hive返回星期几的方法
  2. 月份和星期的英语(请不要再弄错了)
  3. 华为鲲鹏HCIA考试-练习02
  4. pyinstxtractor 源码分析及填坑
  5. Qt开发-QT Widgets
  6. adb不是内部或外部命令,也不是可运行的程序或批处理文件
  7. 【OpenCV学习】第6课:图像模糊(中值滤波,高斯双边滤波)
  8. Smart3D(ContextCapture)跑三维到底要啥配置?!40000元来组建建模集群
  9. 董树义 近代微波测量技术_潘时龙:28岁推开微波光子学大门
  10. linux 下安装xampp