当前位置: 首页 > news >正文

【C#】自定义List排序规则的两种方式

目录

1.系统排序原理

2.方式一:调用接口并重写

3.方式二:传排序规则函数做参数


1.系统排序原理

当我们对一个List<int>类型的数组如list1排序时,一个轻松的list1.sort();帮我们解决了问题

但是在实际应用过程中,往往我们遇到的问题会更加棘手

比如这样一个类:

    class BagItem{public int id;public string name;public int count;public BagItem(int id, string name, int count){this.id = id;this.name = name;this.count = count;}}

这是一个背包物品类,包含了物品编号id,物品名称name,物品数量count

            List<BagItem> bagItems = new List<BagItem>();//传入参数依次为id,name,countbagItems.Add(new BagItem(1, "生命药水", 5));bagItems.Add(new BagItem(2, "魔力药水", 12));bagItems.Add(new BagItem(3, "速度药水", 7));bagItems.Add(new BagItem(4, "铁皮药水", 3));bagItems.Add(new BagItem(5, "重力药水", 9));bagItems.Add(new BagItem(6, "回城药水", 2));bagItems.Sort();

当我们创建一个List<BagItem>数组并想对它排序时,猜猜会发生什么?

这时系统会报错

想要弄明白为什么报错,需要先解释一个sort排序的原理

sort排序时会用到CompareTo函数,这个函数方法存放在IComparable接口

之前我们List<int>类型数组排序能够成功是因为int类调用了上述接口并实现,所以sort排序时可以成功运行

可以看到int类调用了IComparable接口

而我们自己写的类调用不到对应类型的函数,所以运行失败

接下来将介绍两种方法时得我们自己写的类可以成功排序

2.方式一:调用接口并重写

既然int类可以调用,我们也可以给自己写的类调用这个接口

    class BagItem:IComparable<BagItem>{public int id;public string name;public int count;public BagItem(int id, string name, int count){this.id = id;this.name = name;this.count = count;}public int CompareTo(BagItem other){//返回类型int//返回值>0时,当前成员排在other成员右边//返回值<0时,当前成员排在other成员左边//可以理解为other成员处于0位置if (other.count > this.count || (other.count == this.count && other.id >= this.id))return -1;elsereturn 1;}}internal class Program{static void Main(string[] args){List<BagItem> bagItems = new List<BagItem>();//传入参数依次为id,name,countbagItems.Add(new BagItem(3, "生命药水", 5));bagItems.Add(new BagItem(2, "魔力药水", 12));bagItems.Add(new BagItem(1, "速度药水", 12));bagItems.Add(new BagItem(5, "铁皮药水", 3));bagItems.Add(new BagItem(4, "重力药水", 9));bagItems.Add(new BagItem(6, "回城药水", 2));foreach (BagItem item in bagItems){Console.WriteLine("物品:{0},id:{1},数量{2}",item.name,item.id,item.count);}bagItems.Sort();Console.WriteLine("---------------------");foreach (BagItem item in bagItems){Console.WriteLine("物品:{0},id:{1},数量{2}", item.name, item.id, item.count);}}}

3.方式二:传排序规则函数做参数

当我们查看sort用法时,我们可以看到它还有其他重载类型

我们默认使用的是第三种无参数的类型,如果我们写一个函数作为参数传入时,那么就可以使用第一类型,传入我们自己的比较规则。

    internal class Program{static void Main(string[] args){List<BagItem> bagItems = new List<BagItem>();//传入参数依次为id,name,countbagItems.Add(new BagItem(3, "生命药水", 5));bagItems.Add(new BagItem(2, "魔力药水", 12));bagItems.Add(new BagItem(1, "速度药水", 12));bagItems.Add(new BagItem(5, "铁皮药水", 3));bagItems.Add(new BagItem(4, "重力药水", 9));bagItems.Add(new BagItem(6, "回城药水", 2));foreach (BagItem item in bagItems){Console.WriteLine("物品:{0},id:{1},数量{2}",item.name,item.id,item.count);}bagItems.Sort(SortBagItems);Console.WriteLine("---------------------");foreach (BagItem item in bagItems){Console.WriteLine("物品:{0},id:{1},数量{2}", item.name, item.id, item.count);}}static int SortBagItems(BagItem left,BagItem right){//返回类型int//返回值>0时,当前成员排在other成员右边//返回值<0时,当前成员排在other成员左边//可以理解为other成员处于0位置if (right.count > left.count || (right.count == left.count && right.id >= left.id))return -1;elsereturn 1;}}

http://www.lryc.cn/news/360833.html

相关文章:

  • ANAH数据集- 大模型幻觉细粒度评估工具
  • AI前沿技术探索:智能化浪潮下的创新与应用
  • JVM类加载过程
  • 如何安装ansible
  • html+CSS+js部分基础运用11
  • 6,串口编程———通过串口助手发送数据,控制led亮灭
  • 【java】【python】leetcode刷题记录--栈与队列
  • java并发常见问题
  • 联芸科技偏高的关联交易:业绩波动性明显,海康威视曾拥有一票否决
  • hexo init命令报错:Error: EPERM: operation not permitted, mkdir ‘D:\‘
  • day-37 最大正方形
  • springboot 3.3版本 类数据共享(CDS)提升启动速度 使用方法+Docker打包代码
  • Django 目录
  • VirtualBox Ubuntu系统硬盘扩容
  • 【自动驾驶】针对低速无人车的线控底盘技术
  • Kotlin 继承和实现
  • MATLAB误差估计扩展卡尔博斯方法的目录大纲
  • NetMizer 日志管理系统前台RCE漏洞
  • 【spring】第二篇 bean实例化
  • MVC和MVVM
  • 【康耐视国产案例】智能AI相机机器视觉精准快速实现包裹标签的智能粘贴
  • 发现真正的诉求
  • Spring Boot配置MySQL数据库连接数
  • springboot595基于Java的大学生迎新系统-手把手调试搭建
  • 20 道大模型面试问题(含答案)
  • 【Java面试】四、MySQL篇(上)
  • 【Python】collections模块:高效处理数据的利器
  • Vue3实战笔记(51)—Vue 3封装带均线的k线图
  • 信息与未来2015真题笔记
  • 【成功解决】Access token invalid or no longer valid