【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的三种方式,构造方法,静态工厂和实例工厂 在讲解这…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

