一、方法概述

自定义比较器需要实现接口IComparer<T>

二、示例过程

1、新建一个Product产品类

    /// <summary>
/// 产品类
/// </summary>
public class Product
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 价格
/// </summary>
public Double Price { get; set; }
/// <summary>
/// 编号
/// </summary>
public int Num { get; set; }
}

2、新建一个Product对象并赋值

List<Product> products = new List<Product>();
products.Add(new Product() { Name = "pro1", Price = 2.4, Num = });
products.Add(new Product() { Name = "pro2", Price = 4.6, Num = });
products.Add(new Product() { Name = "pro3", Price = 1.8, Num = });
products.Add(new Product() { Name = "pro4", Price = 25.2, Num = });

3、创建比较器

(1) 产品价格比较器:

    /// <summary>
/// 产品价格比较器
/// </summary>
public class ProductPriceComparer : IComparer<Product>
{
public int Compare(Product x,Product y)
{
if (x == null && y == null) return ;
if (x == null) return -;
if (y == null) return ;
var diff = x.Price - y.Price;
if (diff > ) return ;
if (diff < ) return -;
return ;
}
}

(2) 产品名称比较器:

    /// <summary>
/// 产品名称比较器
/// </summary>
public class ProductNameComparer : IComparer<Product>
{
public int Compare(Product x,Product y)
{
if (x == null && y == null) return ;
if (x == null) return -;
if (y == null) return ;
return x.Name.CompareTo(y.Name);
}
}

(3) 产品编号比较器:

    /// <summary>
/// 产品编号比较器
/// </summary>
public class ProductNumComparer : IComparer<Product>
{
public int Compare(Product x, Product y)
{
if (x == null && y == null) return ;
if (x == null) return -;
if (y == null) return ;
return x.Num-y.Num;
}
}

4、打印输出结果的方法

        /// <summary>
/// 打印结果
/// </summary>
/// <param name="products"></param>
public static void PrintResult(List<Product> products)
{
Console.WriteLine("开始打印");
foreach (var product in products)
{
Console.WriteLine($"name:{product.Name},price:{product.Price},num:{product.Num}");
}
Console.WriteLine("打印完毕");
Console.WriteLine("----------分割线----------------------");
}

5、通过比较器排序并打印出结果

    products.Sort(new ProductNameComparer());
Console.WriteLine("根据名称排序:");
PrintResult(products); products.Sort(new ProductNumComparer());
Console.WriteLine("根据编号排序:");
PrintResult(products); products.Sort(new ProductPriceComparer());
Console.WriteLine("根据价格排序:");
PrintResult(products);

6、输出结果

通过自定义比较器排序(C#版)的更多相关文章

  1. Collections之sort的两个方法(自然排序和自定义比较器排序)

    Collections是个服务于Collection的工具类(静态的),它里面定义了一些集合可以用到的方法. 本文演示了Collections类里sort()的两个方法.第一种只需传入被排序的集合,便 ...

  2. 自定义比较器(IComparer接口的实现)

    class FileNameSort : IComparer { [System.Runtime.InteropServices.DllImport("Shlwapi.dll", ...

  3. TreeSet 比较器排序 自定义对象

    package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...

  4. list<T> 自定义比较器进行排序

    今天在研究List<T> 集合如何排序,我试过很多,但是都不行,然后看到msdn中的这个比较器排序,自己测试了代码,No Problem.给大家分享一下. 类型 T 的默认比较器按如下方式 ...

  5. SortedMap接口的实现类TreeMap介绍和实现Comparator自定义比较器(转)

    与SortedSet接口类似,SortedMap也是一个结构,待排序的Map,其一个比较常用的实现类是TreeMap. TreeMap的put(K key, V value)方法在每添加一个元素时,都 ...

  6. MySQL按指定字段自定义列表排序

    亲测实例: 1级排序:同城>异城 2级排序:未领养>以领养 3级排序:发布最新靠前 MYSQL语句如下: SELECT ura.id,ura.city,ura.uid,ura.rescue ...

  7. [c#基础]泛型集合的自定义类型排序

    引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...

  8. Java中的equals方法和自定义比较器

    Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...

  9. 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

随机推荐

  1. css3基础一

    1,css简介 CSS 用于控制网页的样式和布局.样式定义如何显示html元素,样式通常保存在外部的 .css 文件中.通过仅仅编辑一个简单的 CSS 文档,外部样式表使你有能力同时改变站点中所有页面 ...

  2. LwIP Application Developers Manual3---链路层和网络层协议之ARP,IPV4

    1.前言 本文主要讲述链路层和网络层的几种协议:ARP,ipv4 2. ARP 2.1 ARP的主要应用 ARP的主要应用是在与互联网相连的以太网网络层,该层需要一些机制将MAC地址(该地址主要由制造 ...

  3. LwIP Application Developers Manual1---介绍

    1.前言 本文主要是对LwIP Application Developers Manual的翻译 2.读者(应用开发手册的读者) 谁适合读这份手册 网络应用的开发者 想了解lwIP的网络应用开发者 阅 ...

  4. MySQL查看表的索引【转】

    查看表的索引: show index from table_name(表名) 结果列表中各字段的含义: · Non_unique 如果索引不能包括重复词,则为0.如果可以,则为1. · Key_nam ...

  5. js模板引擎-art-template常用总结(转)

    原文:https://www.cnblogs.com/shiyou00/p/6841801.html art-template javascript 模板引擎,官网:https://github.co ...

  6. Minidump文件分析

    原文地址:blog.csdn.net/pkrobbie/article/details/6636310 简介 在过去几年里,崩溃转储(crash dump)成为了调试工作的一个重要部分.如果软件在客户 ...

  7. Mudo C++网络库第二章学习笔记

    线程同步的精要 并发有两种基本的模型: 一种是message passing(消息传递); 另一种是shared memory(共享内存); 在分布式系统中(有多台物理机需要通信), 运行在多台机器上 ...

  8. xl2tpd[26104]: Maximum retries exceeded for tunnel 33925. Closing

    Sep  5 14:31:50 root charon: 13[ENC] generating QUICK_MODE request 3930082374 [ HASH ]Sep  5 14:31:5 ...

  9. 将C注册到lua环境中使用

    注册到lua的方式有两种,一种是lua解释器,如果支持动态链接,使用动态链接机制,将函数接口编译成动态链接库,然后将动态链接库放到lua的C路径(LUA_CPATH)中,然后在lua文件中直接使用 r ...

  10. 【算法】二分查找法&大O表示法

    二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...