List类中不带参数的Sort函数可以用来为List类中的元素排序,但如果List类中的元素类型本身不能直接进行比较(如自定义的struct和很多class),或是希望采用更加灵活的自定义比较方式,可以通过继承了IComparer接口的函数来解决。

代码示例如下:

1)声明一个类

  1. /// <summary>
  2. /// 人物类
  3. /// </summary>
  4. public class Person
  5. {
  6. public string Name;
  7. public int Age;
  8. public override string ToString()
  9. {
  10. return "Name: " + Name + " Age: " + Age;
  11. }
  12. }

2)声明一个继承了接口IComparer的类

  1. /// <summary>
  2. /// 比较人物类实例大小,实现接口IComparer
  3. /// </summary>
  4. public class PersonComparer : IComparer<Person>
  5. {
  6. public int Compare(Person x, Person y)
  7. {
  8. if (x == null && y == null) return ;
  9. if (x == null) return -;
  10. if (y == null) return ;
  11.  
  12. //TODO:Person类实例X与Y的比较规则
  13. //按姓名由小到大排列,姓名相同的人年龄大的在前
  14. {
  15. int temp = string.Compare(x.Name, y.Name);
  16. if (temp > ) return -;
  17. else if (temp < ) return ;
  18.  
  19. if (x.Age > y.Age) return ;
  20. if (x.Age < y.Age) return -;
  21. }
  22.  
  23. return ;
  24. }
  25. }

3)Main函数,建立一个List,并使用刚建立的PersonComparer类中的规则对List进行排序

  1. static void Main(string[] args)
  2. {
  3. List<Person> a = new List<Person>();
  4.  
  5. a.Add(new Person() { Name = "Tsybius", Age = });
  6. a.Add(new Person() { Name = "Galatea", Age = });
  7. a.Add(new Person() { Name = "Lucius", Age = });
  8. a.Add(new Person() { Name = "Septimus", Age = });
  9. a.Add(new Person() { Name = "Octavius", Age = });
  10. a.Add(new Person() { Name = "Lucius", Age = });
  11.  
  12. //输出a中全部元素
  13. Console.WriteLine("排序前");
  14. foreach (var v in a)
  15. {
  16. Console.WriteLine(v.ToString());
  17. }
  18. Console.WriteLine("-");
  19.  
  20. //对a进行排序
  21. a.Sort(new PersonComparer());
  22.  
  23. //输出a中全部元素
  24. Console.WriteLine("排序后");
  25. foreach (var v in a)
  26. {
  27. Console.WriteLine(v.ToString());
  28. }
  29. Console.WriteLine("-");
  30.  
  31. Console.ReadLine();
  32. }

4)程序运行示例

END

C# 使用IComparer自定义List类的排序方案的更多相关文章

  1. C#学习笔记(14)——C# 使用IComparer自定义List类的排序方案

    说明(2017-7-17 21:34:59): 原文:https://my.oschina.net/Tsybius2014/blog/298702?p=1 另一篇比较好的:https://wenku. ...

  2. java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义

    package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...

  3. 关于MapReduce中自定义分区类(四)

    MapTask类 在MapTask类中找到run函数 if(useNewApi){       runNewMapper(job, splitMetaInfo, umbilical, reporter ...

  4. iOS探索:对NSArray中自定义的对象进行排序

    http://mobile.51cto.com/hot-434804.htm 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天 ...

  5. [转]掌握 ASP.NET 之路:自定义实体类简介 --自定义实体类和DataSet的比较

    转自: http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?mfr=true 发布日期 : ...

  6. 《java入门第一季》之TreeSet存储自定义对象并保证排序和唯一

    上一篇用一个简单的例子,介绍了treeset集合存储的内部过程,这里再完善其存储自定义对象保证唯一. 需求:A:  * 自然排序,按照年龄从小到大排序  *         B:  * 成员变量值都相 ...

  7. 当我们用自定义的类对象作为key时,我们必须在程序中覆盖HashCode()和equals()。

    Key值既然可以作为对象,那么也可以用一个自定义的类.比如: m.put(new sutdent(“Liucy”,30),”boss”) 如果没有语句来判定Student类对象是否相同,则会全部打印出 ...

  8. DRF JWT的用法 & Django的自定义认证类 & DRF 缓存

    JWT 相关信息可参考: https://www.jianshu.com/p/576dbf44b2ae DRF JWT 的使用方法: 1. 安装 DRF JWT # pip install djang ...

  9. PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)

    前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...

随机推荐

  1. Redis持久化

    Redis持久化 快照(默认) 将内存中的数据以快照的方式写入到二进制文件中,默认文件名是dump.rdb. 配置自动化做快照持久化(如redis在n秒内如果超过m个key被修改就自动做快照) sav ...

  2. log4j使用总结

    1.不同包的日志,记录到不同文件 log4j.logger.com.gyoung.service.impl=INFO,Doc log4j.appender.Doc=com.gyoung.logger. ...

  3. mysql 创建用户、授权等操作

    一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指 ...

  4. python的异常处理

    在所有的程序中,都会遇到异常,有些异常是代码编写的时候产生的,在前期过程中可能会直接导致程序无法运行.这一类的异常,在编写代码的时候,程序可以直接排查修改.但有些异常,是在程序运行过程中产生的,可能是 ...

  5. R3.2.2安装

  6. java求字符串数组交集、并集和差集

    import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Ma ...

  7. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  8. DataGridView回车焦点横向移动

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)        {            if (keyData ...

  9. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

  10. 谈谈iOS中的屏幕方向

    众所周知,iOS中提供了[UIDevice currentDevice].orientation与[UIApplication sharedApplication].statusBarOrientat ...