通过自定义比较器排序(C#版)
一、方法概述
自定义比较器需要实现接口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#版)的更多相关文章
- Collections之sort的两个方法(自然排序和自定义比较器排序)
Collections是个服务于Collection的工具类(静态的),它里面定义了一些集合可以用到的方法. 本文演示了Collections类里sort()的两个方法.第一种只需传入被排序的集合,便 ...
- 自定义比较器(IComparer接口的实现)
class FileNameSort : IComparer { [System.Runtime.InteropServices.DllImport("Shlwapi.dll", ...
- TreeSet 比较器排序 自定义对象
package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...
- list<T> 自定义比较器进行排序
今天在研究List<T> 集合如何排序,我试过很多,但是都不行,然后看到msdn中的这个比较器排序,自己测试了代码,No Problem.给大家分享一下. 类型 T 的默认比较器按如下方式 ...
- SortedMap接口的实现类TreeMap介绍和实现Comparator自定义比较器(转)
与SortedSet接口类似,SortedMap也是一个结构,待排序的Map,其一个比较常用的实现类是TreeMap. TreeMap的put(K key, V value)方法在每添加一个元素时,都 ...
- MySQL按指定字段自定义列表排序
亲测实例: 1级排序:同城>异城 2级排序:未领养>以领养 3级排序:发布最新靠前 MYSQL语句如下: SELECT ura.id,ura.city,ura.uid,ura.rescue ...
- [c#基础]泛型集合的自定义类型排序
引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...
- Java中的equals方法和自定义比较器
Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...
- 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...
随机推荐
- ActiveMQ中JMS的可靠性机制
全文用到的生产者代码: package cn.qlq.activemq; import javax.jms.Connection; import javax.jms.ConnectionFactory ...
- SQL Server - GO
GO GO是批处理的标志,是一条或多条SQL语句的集合,SQL Server将批处理语句编译成一个可执行单元,此单元称为执行计划. GO语句把程序分成一个个代码块,即使一个代码块执行错误,它后面的代码 ...
- 【转】Vim速查表-帮你提高N倍效率
Vim速查表-帮你提高N倍效率 转自:https://www.jianshu.com/p/6aa2e0e39f99 去年上半年开始全面使用linux进行开发和娱乐了,现在已经回不去windows了. ...
- 使用 ffmpeg nginx rtmp 搭建实时流处理平台
环境: ubuntu 16.04 问题引入: 使用 opencv 获取摄像头数据帧, 进行处理之后(如进行 keypoint 识别), 将 opencv 中图像的 Mat类型转化为 ffmpeg 的 ...
- k64 datasheet学习笔记52---Universal Asynchronous Receiver/Transmitter (UART)
1.前言 UART实现与外设或CPU的通信 2. UART概述 2.1基本特性 (1)Full-duplex operation (2)Standard mark/space non-return-t ...
- 设计模式C++学习笔记之三(Singleton单例模式)
单例模式看起来也蛮简单的,就是在系统中只允许产生这个类的一个实例,既然这么简单,就直接贴代码了.更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com. 3.1.解释 main ...
- Linux下设置时间
Linux下设置时间 提供两种最根本有效的方式,就是更改时区.这里以更改为国内上海时间例子,其他地方时区同理. 方法一 备份文件 mv /etc/localtime /etc/localtime.ba ...
- Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化
题意 一个长度$n<=1e5$的数轴,$m<=1e5$个操作 有两种一些操作 $0$ $x$ 在$x$放一个食物 $1$ 一个虫子去吃最近的食物,如果有两个食物一样近,不转变方向的去吃 ...
- ffmpeg-3.2.4-static-win32-for-XP-bin.tar.xz
ffmpeg-3.2.4-static-win32-for-XP-bin.tar.xz ffmpeg-3.2.4-static-win32-for-XP-bin-v3.tar.xz v3版本升级了库文 ...
- groupID和artifactID填什么
Maven的pom.xml文件中的groupID和artifactID: GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构.ArtifactID就是 ...