【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排序时可以成功运行
而我们自己写的类调用不到对应类型的函数,所以运行失败
接下来将介绍两种方法时得我们自己写的类可以成功排序
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;}}
相关文章:
【C#】自定义List排序规则的两种方式
目录 1.系统排序原理 2.方式一:调用接口并重写 3.方式二:传排序规则函数做参数 1.系统排序原理 当我们对一个List<int>类型的数组如list1排序时,一个轻松的list1.sort();帮我们解决了问题 但是在实际应用过程中,往往我们…...
ANAH数据集- 大模型幻觉细粒度评估工具
大型语言模型(LLMs)在各种自然语言处理任务中取得了显著的性能提升。然而,它们在回答用户问题时仍面临一个令人担忧的问题,即幻觉,它们会产生听起来合理但不符合事实或无意义的信息,尤其是当问题需要大量知…...
AI前沿技术探索:智能化浪潮下的创新与应用
一、引言 随着科技的不断进步,人工智能(AI)已成为推动社会发展的重要力量。从自动驾驶汽车到智能医疗诊断,从智能家居到虚拟助手,AI技术正逐渐渗透到我们生活的方方面面。本文旨在探讨AI的前沿技术、创新应用以及未来…...
JVM类加载过程
在Java虚拟机规范中,把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java.lang.Class对象,这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段&…...
如何安装ansible
ansible安装 1、 准备环境----关闭防护墙和selinux 一般用ansible不会少于10台以上 环境: 主机:4台 一个控制节点 3个被控制节点 解析:本地互相解析(所有机器) # vim /etc/hosts 192.168.1.10 ansible-web1 192.168.1.11 ansible-web2 192.168.1.12…...
html+CSS+js部分基础运用11
一、改变新闻网页中的字号 1、设计如图1-1所示的界面,要求当网络访问者选择字号中的【大、中、小】时能实现页面字号大小变化,选择“中”时,页面效果如图1所示。 图1 单击前初始状态页面 图2 单击“中”链接后页面 2、div中内容如下&#x…...
6,串口编程———通过串口助手发送数据,控制led亮灭
//功能:串口助手每次发送数据格式:0000& // 第二个字节控制LED1亮灭 // 第三个字节控制LED2亮灭 // 第四个字节控制LED3亮灭 // 第无个字节控制LED4亮灭 //要求:代码能够一直运行,能够接收多字节数据 上节讲了串口的基本…...
【java】【python】leetcode刷题记录--栈与队列
232 用栈实现队列 题目描述 两个栈模拟队列的思路是利用栈(后进先出结构)的特性来实现队列(先进先出结构)的行为。这种方法依赖于两个栈来逆转元素的入队和出队顺序,从而实现队列的功能。 入队操作(使用s…...
java并发常见问题
1.死锁:当两个或多个线程无限期地等待对方释放锁时发生死锁。为了避免这种情况,你应该尽量减少锁定资源的时间,按顺序获取锁,并使用定时锁尝试。 2.竞态条件:当程序的行为依赖于线程的执行顺序或输入数据到达的顺序时…...
联芸科技偏高的关联交易:业绩波动性明显,海康威视曾拥有一票否决
《港湾商业观察》施子夫 5月31日,上交所上市审核委员会将召开2024年第14次审议会议,届时将审议联芸科技(杭州)股份有限公司招股书(以下简称,联芸科技)的首发上会事项。 据悉,此次系…...
hexo init命令报错:Error: EPERM: operation not permitted, mkdir ‘D:\‘
我用的是git bash通过hexo init安装hexo的,但是报错如下: $ hexo init INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: HTTP/2 stream 1 was not clos…...
day-37 最大正方形
思路 动态规划,这题主要得弄明白状态转换方程,dp[i][j]表示以(i,j)为右下角的最大正方形 解题方法 1.首先将第一行和第一列初始化,当对应位置的matrix为’0’时,dp数组对应位置也为零,否则为1 …...
springboot 3.3版本 类数据共享(CDS)提升启动速度 使用方法+Docker打包代码
springboot 3.3 版本已经正式发布,新版本提供了类数据共享(CDS)功能,通过将类元数据缓存在 Archive(归档/存档) 文件中,使其可以快速预加载到新启动的 JVM 中,从而帮助缩短 JVM 的启…...
Django 目录
Django 创建项目及应用-CSDN博客 Django 注册应用-CSDN博客 Django 应用的路由访问-CSDN博客 Django templates 存放html目录-CSDN博客 Django 解析路由参数-CSDN博客 Django 用re_path()方法正则匹配复杂路由-CSDN博客 Django 反向解析路由-CSDN博客 Django HttpReques…...
VirtualBox Ubuntu系统硬盘扩容
1、关闭虚拟机,找到需要扩容的硬盘,修改为新的容量80GB,应用保存。 2、打开VM,进入系统,使用lsblk可以看到硬盘容量已经变为80GB,但硬盘根分区还没有扩容,使用df查看根文件系统也没有扩容。 [19…...
【自动驾驶】针对低速无人车的线控底盘技术
目录 术语定义 一般要求 操纵装置 防护等级 识别代号 技术要求 通过性要求 直线行驶稳定性 环境适应性要求 功能安全要求 信息安全要求 故障处理要求 通信接口 在线升级(OTA) 线控驱动 动力性能 驱动控制响应能力 线控制动 行车制动 制动响应能力 线控转向 总体要求 线控…...
Kotlin 继承和实现
文章目录 前言继承(extend)实现(implement)继承与实现 前言 在 Kotlin 中,继承和实现都是在类名后使用冒号:,后边加上其他类或接口的名称来表示,二者之间写法没有太大区别(类需要加…...
MATLAB误差估计扩展卡尔博斯方法的目录大纲
MATLAB误差估计扩展卡尔博斯方法的目录大纲 目录: 一、引言 1.1 背景介绍 1.2 研究意义 二、基本理论 2.1 误差估计的基本概念 2.2 卡尔博斯方法的基本原理 三、MATLAB误差估计扩展卡尔博斯方法 3.1 MATLAB简介 3.2 MATLAB在误差估计中的应用 3.3 MATLAB扩展卡尔…...
NetMizer 日志管理系统前台RCE漏洞
声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、产品介绍 NetMizer日志管理系统是一个与NetMizer流量管理设备配合…...
【spring】第二篇 bean实例化
对象已经能交给Spring的IOC容器来创建了,但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程,在这块内容中主要解决两部分内容,分别是 bean是如何创建的 实例化bean的三种方式,构造方法,静态工厂和实例工厂 在讲解这…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

