当前位置: 首页 > 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.lqws.cn/news/176257.html

相关文章:

  • LangChain【6】之输出解析器:结构化LLM响应的关键工具
  • Vue3 卡片绑定滚动条 随着滚动条展开效果 GSAP动画库 ScrollTrigger滚动条插件
  • 【数据结构】B树
  • 【Survival Analysis】【机器学习】【3】 SHAP可解釋 AI
  • 安装VUE客户端@vue/cli报错警告npm WARN deprecated解决方法 无法将“vue”项识别为 cmdlet、函数
  • vue+elementui 网站首页顶部菜单上下布局
  • 408第一季 - 数据结构 - 栈与队列的应用
  • R²ec: 构建具有推理能力的大型推荐模型,显著提示推荐系统性能!!
  • 市面上哪款AI开源软件做ppt最好?
  • 思尔芯携手Andes晶心科技,加速先进RISC-V 芯片开发
  • sklearn 和 pytorch tensorflow什么关系
  • 解决 VSCode 中无法识别 Node.js 的问题
  • 集群与分布式与微服务
  • Unity优化篇之DrawCall
  • Webpack的基本使用 - babel
  • 动态IP与静态IP:数字世界的“变脸术”与“身份证”
  • FPGA 动态重构配置流程
  • Flutter:下拉框选择
  • mitmproxy 爬虫,下载自己的博客图片
  • 国内环境修改 flutter.bat 来设置 flutter 的网络环境
  • 华为大规模——重塑生产力
  • Editing Language Model-based Knowledge Graph Embeddings
  • 基于AWS Serverless架构:零运维构建自动化SEO内容生成系统
  • aardio 简单网页自动化
  • 大模型安全测试报告:千问、GPT 全系列、豆包、Claude 表现优异,DeepSeek、Grok-3 与 Kimi 存在安全隐患
  • 在.NET Core控制器中获取AJAX传递的Body参数
  • 小牛电动NXT,市场销量第一
  • vscode .husky/pre-commit: line 4: npx: command not found
  • C++ 基础特性深度解析
  • 【AI论文】超越80/20规则:高熵少数令牌驱动LLM推理的有效强化学习