C#里List.Sort的用法

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace ListSort
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. List<C> L = new List<C>();
  13. L.Add(new C { n = 1, s = "b" });
  14. L.Add(new C { n = 3, s = "a" });
  15. L.Add(new C { n = 2, s = "c" });<br>
  16. // 方法1 使用Comparison<T>委托。
  17. L.Sort((left, right) =>
  18. {
  19. if (left.n > right.n)
  20. return 1;
  21. else if (left.n == right.n)
  22. return 0;
  23. else
  24. return -1;
  25. });
  26.  
  27. // 方法2 使用IComparer<T>接口。
  28. L.Sort(new CComparer());
  29.  
  30. // 方法3 除以上两种方法以外还可以使用另一种方法,在C类中实现IComparable<T>
  31. L.Sort();
  32. }
  33. }
  34. //方法二
  35. public class CComparer : IComparer<C>
  36. {
  37. public int Compare(C left, C right)
  38. {
  39. if (left.n > right.n)
  40. return 1;
  41. else if (left.n == right.n)
  42. return 0;
  43. else
  44. return -1;
  45. }
  46. }
  47. //方法三
  48. public class C : IComparable<C>
  49. {
  50. public int n;
  51. public string s;
  52.  
  53. public int CompareTo(C other)
  54. {
  55. if (this.n > other.n)
  56. return 1;
  57. else if (this.n == other.n)
  58. return 0;
  59. else
  60. return -1;
  61. }
  62. }
  63. }

IComparer接口及Comparison委托应用于集合排序

需要对list进行排序,可以用list.Sort()方法。该方法有多个重载。

(1)使用IComparer<T>接口

可以为Sort传入IComparer<T>的实现类的实例对象,该接口为:

  1. public interface IComparer<in T>
  2. {
  3.  
  4. //如果x小于y,则返回负数;x大于y,返回正数;等于则返回0
  5. int Compare(T x, T y);
  6.  
  7. }

void Sort(IComparer<T> comparison);

如果使用IComparer<T>实现类的实例对象,则需要实现定义好实现类,对于已经定义好的,则比较方便,否则相对麻烦一些。

(2)使用Comparison<T>委托

但是对于没有定义IComparer<T>的实现类的场合,可以使用更为方便的方式,即使用Comparison<T>委托作为参数。

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

void Sort(Comparison<T> comparison);

具体使用时,可以直接传入委托(或函数名称),也可以直接使用numda表达式。以下是使用Lambda表达式的方法代码:

  1. List<Student> list=new List<Student>(); //Student类中含有Age属性
  2. list.AddRange(....); //添加数据
  3.  
  4. //以下对Student集合按照其Age属性从小到大排序
  5. list.Sort( (x, y) =>
  6. {
  7. if (x.Age < y.Age)
  8. {
  9. return -1;
  10. }
  11. else if (x.Age > y.Age)
  12. {
  13. return 1;
  14. }
  15. else
  16. return 0;
  17. }
  18. );
  19.  
  20. //或者以下更加简单的写法
  21. list.sort((x,y)=>x.Age.CompareTo(y.Age));

https://www.cnblogs.com/talentzemin/p/3930368.html

https://blog.csdn.net/jiuzaizuotian2014/article/details/82425521

C# List.Sort与IComparer接口及Comparison委托应用于集合排序的更多相关文章

  1. Icomparer和Icomparable集合排序

    c#中实现对象集合的排序可以使用ArrayList中的Sort()方法,而有比较才能谈排序,因为不是基本类型(如string ,int.double......等)所以.NET Framework不可 ...

  2. C# IComparable接口、IComparer接口和CompareTo(Object x)方法、Compare()方法

    在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异.比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?重新实现IComparer接口 ...

  3. IComparable和IComparer接口

    C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表 ...

  4. c# 实现IComparable、IComparer接口、Comparer类的详解

    在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...

  5. [0] 关于IComparable和IComparer接口和Comparer类

    关于IComparable和IComparer接口 和 Comparer类 IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下: ...

  6. Java中使用Collections.sort()方法对数字和字符串泛型的LIst进行排序

    在List的排序中常用的是Collections.sort()方法,可以对String类型和Integer类型泛型的List集合进行排序. 首先演示sort()方法对Integer类型泛型的List排 ...

  7. linux下sort命令使用详解---linux将文本文件内容加以排序命令

    转载自:http://www.cnblogs.com/hitwtx/archive/2011/12/03/2274592.html linux下sort命令使用详解---linux将文本文件内容加以排 ...

  8. C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序

    借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...

  9. IComparable<T> Vs. IComparer<T> System.Comparison<T>

    Well they are not quite the same thing as IComparer<T> is implemented on a type that is capabl ...

随机推荐

  1. kubectl命令管理

    kubectl命令管理 查看更多帮助命令 [root@k8s-master ~]# kubectl --help 创建一个命名空间 [root@k8s-master ~]# kubectl creat ...

  2. STM32驱动LCD原理

    TFTLCD即薄膜晶体管液晶显示器.它与无源TN-LCD.STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性 ...

  3. mastercam2018安装教程

    安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文. [安装环境]:Win7/Win8/Win10 1.选中[Mastercam2018]压缩包,鼠标右击选择[解压到Ma ...

  4. 1.2V升3.3V芯片,大电流,应用MCU供电,3.3V稳压源

    MCU供电一般是2.5V-5V之间等等都有,1.2V需要升到3.3V的升压芯片来稳压输出3.3V给MCU供电. 同时1.2V的输入电压低,说明供电端的能量也是属于低能量的,对于芯片自身供货是也要求高. ...

  5. 使用fdopen对python进程产生的文件进行权限最小化配置

    需求背景 用python进行文件的创建和读写操作时,我们很少关注所创建的文件的权限配置.对于一些安全性较高的系统,如果我们创建的文件权限其他用户或者同一用户组里的其他用户有可读权限的话,有可能导致不必 ...

  6. ASP Net Core – CORS 预检请求

    CORS(跨源资源共享)是一种机制,它允许同一个来源运行的Web应用程序从在另一个来源运行的服务器访问资源.同源策略是一种非常严格的措施,因为它只允许与服务器起源于同一源的应用程序访问其资源.很多时候 ...

  7. LVS负载均衡理论以及算法概要

    一. LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.or ...

  8. Markdown 编辑器+同步预览+文件笔记管理+静态博客 metadata 管理

    Leanote: 1. 笔记管理, 支持富文本, markdown, 写作模式.... 编辑器绝对好用. 另外特意为coder制作了一个贴代码的插件, 真是太贴心(因为作者也是coder) 2. 博客 ...

  9. Django Admin后台添加用户时出现报错:1452

    如果在使用Django Admin后台添加用户时出现报错: (1452, 'Cannot add or update a child row: a foreign key constraint fai ...

  10. springboot2.2.2集成6.5 Elasticsearch

    1.0POM文件 <!-- spring-boot --> <dependency> <groupId>org.springframework.boot</g ...