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

【从零开始入门unity游戏开发之——C#篇35】C#自定义类实现Sort自定义排序

文章目录

  • 一、List<T>自带的排序方法
    • 1、List<T>调用Sort()排序
    • 2、 能够使用 `Sort()` 方法进行排序的本质
  • 二、自定义类的排序
    • 1、通过实现泛型`IComparable<T>` 接口
      • (1)示例
      • (2)直接调用 int 类型的 CompareTo 方法进行简化
      • (3)降序排序
    • 2、 直接实现 IComparable 接口(不推荐)
    • 3、通过委托函数进行自定义排序
      • (1)示例
      • (2)使用匿名方法(`Delegate`)简化
      • (3)再使用 Lambda 表达式简化
  • 三、总结
  • 专栏推荐
  • 完结

一、List自带的排序方法

1、List调用Sort()排序

List<T> 提供了一个内建的 Sort() 方法来对列表进行排序。它的基本用法如下:

List<int> list = new List<int> { 3, 2, 6, 1, 4, 5 };
list.Sort(); // 默认升序排序// 输出排序后的结果
foreach (int item in list)
{Console.WriteLine(item);
}

输出:

1
2
3
4
5
6

2、 能够使用 Sort() 方法进行排序的本质

List<int> 能够使用 Sort() 方法进行排序,背后的原因是 int string等类型实现了 IComparable<T> 接口
在这里插入图片描述

在这里插入图片描述

二、自定义类的排序

1、通过实现泛型IComparable<T> 接口

如果想对自定义对象排序,可以让自定义类实现 IComparable<T> 接口。在这个接口中,必须实现 CompareTo 方法来定义对象间的比较规则。

  • CompareTo 方法的基本结构

    public int CompareTo(T other)
    
    • T 是与当前对象进行比较的类型。
    • other 是传入的另一个对象,它与当前对象进行比较。
  • CompareTo 返回值的含义

    CompareTo 方法用于定义对象的排序规则。通过返回的整数值,来决定当前对象与传入对象之间的位置关系。

    • 返回 负值:当前对象排在传入对象前面。
    • 返回 0:当前对象与传入对象相等(不改变位置)。
    • 返回 正值:当前对象排在传入对象后面。

(1)示例

public class Item : IComparable<Item>
{public int money;public Item(int money){this.money = money;}public int CompareTo(Item? other){if (other == null) return 1;if (this.money > other.money){return 1;// 返回 `正值`:当前对象排在传入对象后面。}else if (this.money < other.money){return -1;// 返回 `负值`:当前对象排在传入对象前面。}else{return 0;// 返回 `0`:当前对象与传入对象相等(不改变位置)。}}
}

调用.Sort()进行排序

List<Item> itemList = new List<Item>
{new Item(45),new Item(10),new Item(99),new Item(24),new Item(100),new Item(12)
};itemList.Sort(); // 使用 Sort() 排序// 输出排序后的结果
foreach (Item item in itemList)
{Console.WriteLine(item.money);
}

输出:

10
12
24
45
99
100

如果想降序,CompareTo返回值正负反过来就行了

(2)直接调用 int 类型的 CompareTo 方法进行简化

这个做法更加简洁,也符合 CompareTo 方法的惯用方式,减少了手动判断大小的代码。

public class Item : IComparable<Item>
{public int money;public Item(int money){this.money = money;}public int CompareTo(Item? other){if (other == null) return 1;// 按照 money 进行排序,升序return this.money.CompareTo(other.money);}
}

(3)降序排序

如果需要降序排序,只需要调整 CompareTo 方法中的返回值逻辑:

public int CompareTo(Item other)
{if (other == null) return 1;// 降序排序return other.money.CompareTo(this.money);
}

2、 直接实现 IComparable 接口(不推荐)

如果你的类不使用泛型接口(IComparable<T>),你也可以使用非泛型的 IComparable 接口来实现排序:

public class Item : IComparable
{public int Money { get; set; }public Item(int money){Money = money;}// 实现 IComparable 接口的 CompareTo 方法public int CompareTo(object obj){if (obj == null) return 1;Item other = obj as Item;if (other == null) throw new ArgumentException("Object is not an Item");return this.Money.CompareTo(other.Money);  // 默认升序排序}
}

这种方式的缺点是需要处理类型转换(as 或者显式转换),并且代码更加冗长。一般情况下,推荐使用泛型 IComparable<T>

3、通过委托函数进行自定义排序

可以通过传入自定义的比较方法(委托)来进行排序。此时,我们定义一个静态方法,并作为参数传入 到Sort() 方法进行排序。

返回值规则和之前一样 0做标准 负数在左(前) 正数在右(后)

(1)示例

using System;public class ShopItem
{public int id;public ShopItem(int id){this.id = id;}
}class Program
{static int SortShopItem(ShopItem a, ShopItem b){return a.id.CompareTo(b.id);  // 升序// return b.id.CompareTo(a.id);  // 降序}static void Main(){List<ShopItem> shopItems = new List<ShopItem>{new ShopItem(2),new ShopItem(1),new ShopItem(4),new ShopItem(3),new ShopItem(6),new ShopItem(5)};shopItems.Sort(SortShopItem); // 使用委托排序// 输出排序后的结果foreach (ShopItem item in shopItems){Console.WriteLine(item.id);}}
}

输出:

1
2
3
4
5
6

(2)使用匿名方法(Delegate)简化

我们也可以使用匿名方法(Delegate)进行排序。这种方法比较灵活,但代码可能会显得比较长:

using System;public class ShopItem
{public int id;public ShopItem(int id){this.id = id;}
}class Program
{static void Main(){List<ShopItem> shopItems = new List<ShopItem>{new ShopItem(2),new ShopItem(1),new ShopItem(4),new ShopItem(3),new ShopItem(6),new ShopItem(5)};shopItems.Sort(delegate (ShopItem a, ShopItem b){return a.id.CompareTo(b.id);  // 升序// return b.id.CompareTo(a.id);  // 降序});// 输出排序后的结果foreach (ShopItem item in shopItems){Console.WriteLine(item.id);}}
}

(3)再使用 Lambda 表达式简化

Lambda 表达式可以让代码更加简洁。它是对委托的一种简化形式,常用于排序操作。

shopItems.Sort((a, b) => {return a.id.CompareTo(b.id);  // 升序// return b.id.CompareTo(a.id);  // 降序
});

或者更简洁的形式

shopItems.Sort((a, b) => a.id.CompareTo(b.id));  // 升序;
//shopItems.Sort((a, b) => b.id.CompareTo(a.id));  // 降序;

三、总结

  • List<T>.Sort() 方法可以直接排序常用类型(如 int, double, string 等)。
  • 对于自定义类型,推荐实现 IComparable<T> 接口,这样可以直接使用 Sort() 方法。
  • 如果不希望修改类本身,也可以通过传入委托函数、匿名方法或 Lambda 表达式来进行排序。
  • 对于需要降序排序的情况,可以调整 CompareTo 方法的返回值,或者在委托中修改比较逻辑。

专栏推荐

地址
【从零开始入门unity游戏开发之——C#篇】
【从零开始入门unity游戏开发之——unity篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架开发】

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

相关文章:

【从零开始入门unity游戏开发之——C#篇35】C#自定义类实现Sort自定义排序

文章目录 一、List<T>自带的排序方法1、List<T>调用Sort()排序2、 能够使用 Sort() 方法进行排序的本质 二、自定义类的排序1、通过实现泛型IComparable<T> 接口&#xff08;1&#xff09;示例&#xff08;2&#xff09;直接调用 int 类型的 CompareTo 方法进…...

音频进阶学习九——离散时间傅里叶变换DTFT

文章目录 前言一、DTFT的解释1.DTFT公式2.DTFT右边释义1&#xff09; 复指数 e − j ω n e^{-j\omega n} e−jωn2&#xff09;序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn复指数序列复数的共轭正交正交集 3&#xff09;复指数序列求和 3.DTF…...

连接github和ai的桥梁:GitIngest

Git ingest GitIngest - 将任何 Github 仓库转变为适合 LLM 的友好型提示文本 (https://github.com/cyclotruc/gitingest) 输入 Github 地址或者名称&#xff0c;GitIngest 就会提供该仓库的总结、目录结构、仓库内容的文本内容 你可以复制这些文本与 AI 大模型更好地对话...

Pytorch使用手册-DCGAN 指南(专题十四)

1. Introduction 本教程将通过一个示例介绍 DCGANs(深度卷积生成对抗网络)。我们将训练一个生成对抗网络(GAN),在给它展示大量真实名人照片后,它能够生成新的“名人”图片。这里的大部分代码来源于 PyTorch 官方示例中的 DCGAN 实现,而本文档将对该实现进行详细解释,并…...

Flume的安装和使用

一、安装Flume 1. 下载flume-1.7.0 http://mirrors.shu.edu.cn/apache/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz 2. 解压改名 tar xvf apache-flume-1.7.0-bin.tar.gz mv apache-flume-1.7.0-bin flume 二、配置Flume 1. 配置sh文件 cp conf/flume-env.sh.template …...

[Hive]七 Hive 内核

1. Hive架构 Hive架构主要包括&#xff1a; 用户界面&#xff1a;命令行&#xff08;CLI&#xff09;和web UIThrift Server&#xff1a;公开了一个非常简单的客户端执行HiveQL语句的API&#xff0c;包括JDBC&#xff08;Java&#xff09;和ODBC&#xff08;C&#xff09;&…...

Druid密码错误重试导致数据库超慢

文章目录 密码错误重试导致数据库超慢如何避免呢&#xff1f; 密码错误重试导致数据库超慢 有同事把项目的数据库密码配错了&#xff0c;导致其他所有连接该数据库的项目全部连接都获取缓慢了&#xff0c;一个页面加载要花费十几秒。排查mysql连接发现很多connect命令的连接 …...

Ubuntu 24.04安装和使用WPS 2019

为Ubuntu找一款免费、功能丰富的 Microsoft Office 替代品&#xff1f;WPS Office是理想选择&#xff01;在本文中&#xff0c;包含在Ubuntu上安装 WPS Office&#xff0c;修复初次使用出现问题的修复。 安装WPS&#xff0c;参考链接>>How to Install WPS Office on Ubu…...

week05_nlp大模型训练·词向量文本向量

1、词向量训练 1.1 CBOW&#xff08;两边预测中间&#xff09; 一、CBOW 基本概念 CBOW 是一种用于生成词向量的方法&#xff0c;属于神经网络语言模型的一种。其核心思想是根据上下文来预测中心词。在 CBOW 中&#xff0c;输入是目标词的上下文词汇&#xff0c;输出是该目标…...

【RabbitMQ消息队列原理与应用】

RabbitMQ消息队列原理与应用 一、消息队列概述 &#xff08;一&#xff09;概念 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;是一种应用程序间的通信方式&#xff0c;它允许应用程序通过将消息放入队列中&#xff0c;而不是直接调用其他应用程序的接口…...

反欺诈风控体系及策略

本文详细介绍了互联网领域金融信贷行业的反欺诈策略。首先&#xff0c;探讨了反欺诈的定义、重要性以及在当前互联网发展背景下欺诈风险的加剧。接着&#xff0c;分析了反欺诈的主要手段和基础技术&#xff0c;包括对中介和黑产的了解、欺诈风险的具体类型和表现方式&#xff0…...

Mac 12.1安装tiger-vnc问题-routines:CRYPTO_internal:bad key length

背景&#xff1a;因为某些原因需要从本地mac连接远程linxu桌面查看一些内容&#xff0c;必须使用桌面查看&#xff0c;所以ssh无法满足&#xff0c;所以决定安装vnc客户端。 问题&#xff1a; 在mac上通过 brew install tiger-vnc命令安装, 但是报错如下&#xff1a; > D…...

【代码分析】Unet-Pytorch

1&#xff1a;unet_parts.py 主要包含&#xff1a; 【1】double conv&#xff0c;双层卷积 【2】down&#xff0c;下采样 【3】up&#xff0c;上采样 【4】out conv&#xff0c;输出卷积 """ Parts of the U-Net model """import torch im…...

【LLM入门系列】01 深度学习入门介绍

NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&#xff0c;分享大模型算法工程师的日常工作和实战经验 AI 藏经阁&#xff1a;https://gitee.com/fasterai/a…...

安卓系统主板_迷你安卓主板定制开发_联发科MTK安卓主板方案

安卓主板搭载联发科MT8766处理器&#xff0c;采用了四核Cortex-A53架构&#xff0c;高效能和低功耗设计。其在4G网络待机时的电流消耗仅为10-15mA/h&#xff0c;支持高达2.0GHz的主频。主板内置IMG GE832 GPU&#xff0c;运行Android 9.0系统&#xff0c;内存配置选项丰富&…...

关键点检测——HRNet原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…...

25考研总结

11408确实难&#xff0c;25英一直接单科斩杀&#x1f62d; 对过去这一年多备考的经历进行复盘&#xff0c;以及考试期间出现的问题进行思考。 考408的人&#xff0c;政治英语都不能拖到最后&#xff0c;408会惩罚每一个偷懒的人&#xff01; 政治 之所以把政治写在最开始&am…...

网络安全态势感知

一、网络安全态势感知&#xff08;Cyber Situational Awareness&#xff09;是一种通过收集、处理和分析网络数据来理解当前和预测未来网络安全状态的能力。它的目的是提供实时的、安全的网络全貌&#xff0c;帮助组织理解当前网络中发生的事情&#xff0c;评估风险&#xff0c…...

在K8S中,节点状态notReady如何排查?

在kubernetes集群中&#xff0c;当一个节点&#xff08;Node&#xff09;的状态变为NotReady时&#xff0c;意味着该节点可能无法运行Pod或不能正确相应kubernetes控制平面。排查NotReady节点通常涉及以下步骤&#xff1a; 1. 获取基本信息 使用kubectl命令行工具获取节点状态…...

深度学习在光学成像中是如何发挥作用的?

深度学习在光学成像中的作用主要体现在以下几个方面&#xff1a; 1. **图像重建和去模糊**&#xff1a;深度学习可以通过优化图像重建算法来处理模糊图像或降噪&#xff0c;改善成像质量。这涉及到从低分辨率图像生成高分辨率图像&#xff0c;突破传统光学系统的分辨率限制。 …...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...