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

代码示例如下:

1)声明一个类

/// <summary>
/// 人物类
/// </summary>
public class Person
{
public string Name;
public int Age;
public override string ToString()
{
return "Name: " + Name + " Age: " + Age;
}
}

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

/// <summary>
/// 比较人物类实例大小,实现接口IComparer
/// </summary>
public class PersonComparer : IComparer<Person>
{
public int Compare(Person x, Person y)
{
if (x == null && y == null) return ;
if (x == null) return -;
if (y == null) return ; //TODO:Person类实例X与Y的比较规则
//按姓名由小到大排列,姓名相同的人年龄大的在前
{
int temp = string.Compare(x.Name, y.Name);
if (temp > ) return -;
else if (temp < ) return ; if (x.Age > y.Age) return ;
if (x.Age < y.Age) return -;
} return ;
}
}

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

static void Main(string[] args)
{
List<Person> a = new List<Person>(); a.Add(new Person() { Name = "Tsybius", Age = });
a.Add(new Person() { Name = "Galatea", Age = });
a.Add(new Person() { Name = "Lucius", Age = });
a.Add(new Person() { Name = "Septimus", Age = });
a.Add(new Person() { Name = "Octavius", Age = });
a.Add(new Person() { Name = "Lucius", Age = }); //输出a中全部元素
Console.WriteLine("排序前");
foreach (var v in a)
{
Console.WriteLine(v.ToString());
}
Console.WriteLine("-"); //对a进行排序
a.Sort(new PersonComparer()); //输出a中全部元素
Console.WriteLine("排序后");
foreach (var v in a)
{
Console.WriteLine(v.ToString());
}
Console.WriteLine("-"); Console.ReadLine();
}

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. powershell例子

    例子如下: $ErrorActionPreference="Stop" function getlist{ ls D:\tmp2|select name,extension,ful ...

  2. java大并发数据保存方案

    做了几年.net,如今终于要做java了. 需求: 线下终端会定时上传gps位置到服务端,服务端收到数据保存到mysql数据库,当线下终端过多时,问题出现了,首当其冲的是数据库连接池经常会崩溃,单个t ...

  3. win10 设置声卡驱动 --- 解决喇叭没有声音!

    win10 设置声卡驱动 --- 解决喇叭没有声音! 1)安装驱动,必须能够在:"控制面板\硬件和声音" 下找到安装好的: "Realtek高清晰音频管理器" ...

  4. gradle

    http://examples.javacodegeeks.com/core-java/gradle/gradle-hello-world-tutorial/

  5. nodeJS(express4.x)+vue(vue-cli)构建前后端分离详细教程(带跨域)

    好想再回到大学宿舍,当时床虽小,房随小,但是心确是满的 ----致  西安工程大学a-114舍友们 转载请注明出处:水车:http://www.cnblogs.com/xuange306/p/6185 ...

  6. BOOST_AUTO宏

    在boost中,有个非常不错的宏BOOST_AUTO(),它的作用是自动给var定义类型,适合function()函数返回的值的类型. int function() { ; } main() { BO ...

  7. php7 安装redis扩展

    从pecl下载的phpredis扩展在make时报错,google了一下,解决办法,因为phpredis 有专门为php7的分支,所以先git clone phpredis下来 git clone h ...

  8. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  9. ModPagespeed for Apache安装配置

    1.安装ModPagespeed #32位wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_i38 ...

  10. unity播放视频

    方法一: 1.用一个Quad(或者其他的)做屏幕,调整摄像机位置和它的大小,使它显示在你想要的区域 2.将视频拖入Unity,拖入,拖入,拖入:不是将视频直接copy到指定的文件夹中 3.将下面脚本挂 ...