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

20250606-C#知识:List排序

C#知识:List排序

默认排序往往不够用,学会自定义排序很重要。


1、默认排序

  • 只有少数类型能用,例如值类型int、float,double等
  • 默认升序
//系统自带排序
List<int> list = new();
list.Add(5);
list.Add(8);
list.Add(1);
list.Add(6);
list.Add(2);
Print<int>(list);   //5 8 1 6 2
//系统默认排序方法,默认升序
list.Sort();
Print<int>(list);   //1 2 5 6 8

2、实现IComparable接口

  • 重写CompareTo方法,实现排序逻辑
class Equipment:IComparable<Equipment>
{public string equipmentName;public int damage;public float price;public Equipment(string equipmentName, int damage, float price){this.equipmentName = equipmentName;this.damage = damage;this.price = price;}public int CompareTo(Equipment? other){if(this.price > other.price)return -1;else if(this.price < other.price)return 1;return 0;}public override string ToString(){return $" 【名称:{equipmentName}, 伤害:{damage}, 价格:{price}】";}
}
List<Equipment> equipments = new List<Equipment>();
equipments.Add(new Equipment("猎犬长牙", 58, 100));
equipments.Add(new Equipment("碎星大剑", 120, 500));
equipments.Add(new Equipment("陨石杖", 60, 300));
equipments.Add(new Equipment("黄铜盾", 0, 200));
//以实现接口方式:价格降序排序
equipments.Sort();  //不实现接口直接排序会报错Unhandled exception. System.InvalidOperationException: Failed to compare two elements in the array.
Print<Equipment>(equipments);//【名称:碎星大剑, 伤害:120, 价格:500】  【名称:陨石杖, 伤害:60, 价格:300】  【名称:黄铜盾, 伤害:0, 价格:200】  【名称:猎犬长牙, 伤害:58, 价格:100】

3、传递委托函数

  • 直接Sort方法传入委托函数参数
//Sort传入委托函数
//伤害升序
equipments.Sort((a, b) =>
{if (a.damage > b.damage)return 1;else if (a.damage < b.damage)return -1;return 0;
});
Print<Equipment>(equipments);//【名称:黄铜盾, 伤害:0, 价格:200】  【名称:猎犬长牙, 伤害:58, 价格:100】  【名称:陨石杖, 伤害:60, 价格:300】  【名称:碎星大剑, 伤害:120, 价格:500】

4、完整代码示例

namespace LearnListSort
{class Equipment:IComparable<Equipment>{public string equipmentName;public int damage;public float price;public Equipment(string equipmentName, int damage, float price){this.equipmentName = equipmentName;this.damage = damage;this.price = price;}public int CompareTo(Equipment? other){if(this.price > other.price)return -1;else if(this.price < other.price)return 1;return 0;}public override string ToString(){return $" 【名称:{equipmentName}, 伤害:{damage}, 价格:{price}】";}}internal class Program{static void Print<T>(List<T> list){foreach (T item in list){Console.Write(item.ToString() + " ");}Console.WriteLine();}static void Main(string[] args){//系统自带排序List<int> list = new();list.Add(5);list.Add(8);list.Add(1);list.Add(6);list.Add(2);Print<int>(list);   //5 8 1 6 2//系统默认排序方法,默认升序list.Sort();Print<int>(list);   //1 2 5 6 8List<Equipment> equipments = new List<Equipment>();equipments.Add(new Equipment("猎犬长牙", 58, 100));equipments.Add(new Equipment("碎星大剑", 120, 500));equipments.Add(new Equipment("陨石杖", 60, 300));equipments.Add(new Equipment("黄铜盾", 0, 200));//以实现接口方式:价格降序排序equipments.Sort();  //不实现接口直接排序会报错Unhandled exception. System.InvalidOperationException: Failed to compare two elements in the array.Print<Equipment>(equipments);//【名称:碎星大剑, 伤害:120, 价格:500】  【名称:陨石杖, 伤害:60, 价格:300】  【名称:黄铜盾, 伤害:0, 价格:200】  【名称:猎犬长牙, 伤害:58, 价格:100】//Sort传入委托函数//伤害升序equipments.Sort((a, b) =>{if (a.damage > b.damage)return 1;else if (a.damage < b.damage)return -1;return 0;});Print<Equipment>(equipments);//【名称:黄铜盾, 伤害:0, 价格:200】  【名称:猎犬长牙, 伤害:58, 价格:100】  【名称:陨石杖, 伤害:60, 价格:300】  【名称:碎星大剑, 伤害:120, 价格:500】}}
}

5、参考资料

  1. 《唐老狮C#》

本文结束,感谢您的阅读~

在这里插入图片描述

http://www.xdnf.cn/news/900757.html

相关文章:

  • 32单片机——窗口看门狗
  • 青少年编程与数学 01-011 系统软件简介 05 macOS操作系统
  • java 实现excel文件转pdf | 无水印 | 无限制
  • 大故障:阿里云核心域名爆炸了
  • 在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
  • Qt客户端技巧 -- 窗口美化 -- 窗口阴影
  • linux 故障处置通用流程-36计-28-37
  • 设计模式——模板方法
  • 基于 JavaSE 实现(GUI)的 小型ATM 银行模拟系统
  • [特殊字符]解决 “IDEA 登录失败。不支持早于 14.0 的 GitLab 版本” 问题的几种方法
  • LangChain【6】之输出解析器:结构化LLM响应的关键工具
  • [ElasticSearch] DSL查询
  • 【Spark征服之路-2.3-Spark运行架构】
  • OpenLayers 分屏对比(地图联动)
  • 【 java 集合知识 第二篇 】
  • CSS 定位:原理 + 场景 + 示例全解析
  • 使用 SymPy 进行向量和矩阵的高级操作
  • uni-app 如何实现选择和上传非图像、视频文件?
  • 山东大学《数据可视化》期末复习宝典
  • 机器学习框架PyTorch
  • Opencv中的copyto函数
  • ESP8266(NodeMcu)+GPS模块+TFT屏幕实现GPS码表
  • 关于双网卡优先级:有效跃点数的解析(设置值×2)
  • day48 python通道注意力
  • 基于AWS Serverless架构:零运维构建自动化SEO内容生成系统
  • Spark 之 DataFrame 开发
  • 内嵌式mqtt server
  • IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
  • halcon 透视矩阵
  • Opencv中的addweighted函数