【从零开始入门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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497302.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【驱动开发】设备分类、设备号申请和注销,注册和移除字符设备,以及一个基本的内核驱动程序框架代码

一、Linux内核对设备的分类 Linux的文件种类 序号符号类型文件内容文件名原信息1-普通文件√√√2d目录文件√√√3p管道文件√√4s本地socket文件√√5l链接文件软链接有;硬链接相当于别名√√6c字符设备√√7b块设备√√设备类型 Linux内核按驱动程序实现模型框架的不同,…

【最新】沃德协会管理系统源码+uniapp前端+环境教程

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的商协会系统&#xff0c;新一代数字化商协会运营管理系统&#xff0c;以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点&#xff0c;实施功能全场景覆盖&#xff0c;一站式解决商协会需求壁垒&#xff0…

Linux-frp_0.61.1内网穿透的配置和使用

下载frp frp官网 https://gofrp.org/zh-cn/docs/setup/ frp安装包下载地址 https://github.com/fatedier/frp/releases?page1 下载之后在服务器上 解压 tar -zxvf frp_0.61.1_linux_amd64.tar.gztar&#xff1a;一个用于压缩和解压缩的工具。-z&#xff1a;表示使用 gzi…

apifox

请求头head 如果传json串的话&#xff0c;需要将Content-Type覆盖为application/json 请求体body 有一个场景&#xff1a;我先创建任务&#xff0c;返回值为任务id&#xff0c;接着我要去根据任务id 删除这个任务 如果创建任务api的返回值中&#xff0c;任务id是以数组/ 对象…

C#运动控制系统:雷赛控制卡实用完整例子 C#雷赛开发快速入门 C#雷赛运动控制系统实战例子 C#快速开发雷赛控制卡

雷赛控制技术 DMC系列运动控制卡是一款新型的 PCI/PCIe 总线运动控制卡。可以控制多个步进电机或数字式伺服电机&#xff1b;适合于多轴点位运动、插补运动、轨迹规划、手轮控制、编码器位置检测、IO 控制、位置比较、位置锁存等功能的应用。 DMC3000 系列卡的运动控制函数库功…

从家谱的层级结构 - 组合模式(Composite Pattern)

组合模式&#xff08;Composite Pattern&#xff09; 组合模式&#xff08;Composite Pattern&#xff09;组合模式概述组合模式涉及的角色talk is cheap&#xff0c; show you my code总结 组合模式&#xff08;Composite Pattern&#xff09; 组合模式&#xff08;Composite…

基于 DINOv2 模型实现图搜图相似度检索任务

一、DINOv2 模型简介及使用 DINOv2是由Meta AI开发的第二代自监督视觉变换器模型&#xff0c;采用 Vision Transformer (ViT) 架构 。其核心特点是在无需人工标签的情况下&#xff0c;通过自监督学习技术&#xff0c;从海量无标注图像中学习有意义的视觉特征表示&#xff0c;类…

STM32高级 以太网通讯案例1:网络搭建(register代码)

需求描述 驱动W5500芯片&#xff0c;设置好IP&#xff0c;测试网络是否连通。 思考&#xff1a; 驱动W5500芯片是通过spi协议&#xff0c;所以和spi相关的有四个引脚&#xff0c;MOSI&#xff08;主出从入&#xff09;MISO&#xff08;主入从出&#xff09;SCK&#xff08;时…

详解VHDL如何编写Testbench

1.概述 仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型&#xff0c;它为所测试的元件提供了激励信号&#xff0c;可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中&#xff0c;也可以从…

【数据结构】单链表的使用

单链表的使用 1、基本概念2、链表的分类3、链表的基本操作a、单链表节点设计b、单链表初始化c、单链表增删节点**节点头插&#xff1a;****节点尾插&#xff1a;****新节点插入指定节点后&#xff1a;**节点删除&#xff1a; d、单链表修改节点e、单链表遍历&#xff0c;并打印…

浅谈某平台多场景下反爬虫与风控业务

文章目录 1. 写在前面2. 内容反爬3. 账号风控3. 接口验签 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码&#xff1f; 前言什么是 GitHub1s&#xff1f;使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

Web Bluetooth API 开发记录

搞了一天的蓝牙串口协议被几个软件和AI带沟里面去了。 1.00001101-0000-1000-8000-00805f9b34fb 是spp协议。但是我用的称是使用的49535343-fe7d-4ae5-8fa9-9fafd205e455蓝牙低功耗spp协议 2.推荐一款软件Android-nRF-Connect github地址&#xff1a;https://github.com/Nor…

使用VS Code开发ThinkPHP项目

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境&#xff08;IDE&#xff09;包括P…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

Windows上缺少xaudio2_9.dll是什么原因?

一、文件丢失问题&#xff1a;Windows上缺少xaudio2_9.dll是什么原因&#xff1f; xaudio2_9.dll是DirectX音频处理库的一个组件&#xff0c;它支持游戏中的音频处理功能。当你在Windows系统上运行某些游戏或音频软件时&#xff0c;如果系统提示缺少xaudio2_9.dll文件&#xf…

缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布

近期&#xff0c;JuiceFS 企业版推出了 Cache Group Operator&#xff0c;用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具&#xff0c;它能够自动化应用程序的生命周期管理任务&#xff0c;使部署、扩展和运维更加高效。 在推出 Operator 之前…

SCSA:探索空间与通道注意力之间的协同效应

文章目录 摘要1 引言2 相关工作2.1 多语义空间信息2.2 注意力分解 3 方法3.1 共享多语义空间注意力&#xff1a;空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…

Grok 2.0:马斯克的大模型挑战ChatGPT,AI竞争再升级

引言&#xff1a;马斯克Grok 2.0的横空出世 在人工智能&#xff08;AI&#xff09;领域&#xff0c;竞争从未停止。随着大型语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;各大科技巨头纷纷推出自己的AI模型&#xff0c;试图在激烈的竞争中占据领先地位。最近&am…

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…