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

在C#中对List<T>实现多属性排序

本文介绍了四种实现多级排序的方法:1. LINQ链式调用:使用OrderByThenBy实现多级排序,直观易读,适合动态需求,返回新列表。2. 自定义比较器(IComparer):适用于复杂或高频排序,性能高,适合固定规则,原地排序。3. 动态排序(反射+LINQ):根据属性名动态排序,需处理反射性能开销和空值。4. 性能对比:LINQ适合简单排序,自定义比较器适合高频复杂排序,动态排序性能较低。示例类Person包含NameAgeScore属性。

可通过‌OrderBy+ThenBy链式调用‌或‌自定义IComparer‌实现,以下是具体方法及示例:

1. LINQ 方法(推荐)‌


使用OrderBy和ThenBy实现多级排序:
 

List<Person> people = new List<Person> {new Person { Name = "Alice", Age = 25, Score = 80 },new Person { Name = "Bob", Age = 30, Score = 90 },new Person { Name = "Alice", Age = 20, Score = 85 }
};// 先按Name升序,再按Age降序,最后按Score升序
var sorted = people.OrderBy(p => p.Name).ThenByDescending(p => p.Age).ThenBy(p => p.Score).ToList();

特点‌:

直观易读,适合动态排序需求。
返回新列表,原列表不变。


‌2. 自定义比较器(IComparer<T>)‌


适用于复杂排序逻辑或需要复用的场景:

class PersonComparer : IComparer<Person> {public int Compare(Person x, Person y) {int nameCompare = x.Name.CompareTo(y.Name);if (nameCompare != 0) return nameCompare;int ageCompare = y.Age.CompareTo(x.Age); // 降序if (ageCompare != 0) return ageCompare;return x.Score.CompareTo(y.Score);}
}// 使用比较器排序
people.Sort(new PersonComparer());

‌特点‌:

性能更高(原地排序)。
适合固定排序规则。

‌3. 动态排序(反射+LINQ)‌


根据属性名动态指定排序字段:

var propertyName = "Age"; // 可动态传入
var ordered = people.OrderBy(p => p.GetType().GetProperty(propertyName)?.GetValue(p)).ToList();

注意‌:需处理反射性能开销和空值7。

‌4. 性能对比‌

方法适用场景性能 可读性
LINQ链式调用简单多属性排序中等★★★★★
自定义IComparer高频或复杂排序★★★☆☆
反射动态排序 字段不确定时★★☆☆☆

5. 示例类定义‌


class Person {public string Name { get; set; }public int Age { get; set; }public int Score { get; set; }
}

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

相关文章:

  • PostgreSQL日常维护
  • FastAPI 支持文件下载和上传
  • Axure项目实战:智慧运输平台后台管理端-订单管理1(多级交互)
  • PDF 文档结构化工具对比:Marker 与 MinerU
  • 整除的进一步性质与最小公倍数
  • 【深度剖析】三一重工的数字化转型(上1)
  • 11-码蹄集600题基础python篇
  • 【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈
  • 智能指针RAII
  • springboot3+vue3融合项目实战-大事件文章管理系统-文章分类也表查询(条件分页)
  • 年会招标抽奖活动软件———仙盟创梦IDE
  • 【后端】【UV】【Django】 `uv` 管理的项目中搭建一个 Django 项目
  • Mysql索引实战1
  • 【人工智能发展史】从黎明到曙光01
  • 回溯法求解N皇后问题
  • 力扣-有效三角形的个数
  • 超低延迟音视频直播技术的未来发展与创新
  • (2025小白全踩坑版)【OpenHarmony】移植 3.1 版本系统到 STM32F407ZG开发板
  • 提问的艺术
  • 华为云Flexus+DeepSeek征文|Flexus云服务器Dify-LLM资源部署极致体验Agent
  • Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]]
  • labview硬件部分——压力测量
  • labview——控制继电器模块
  • Tiny C 编译器中,如何实现宏展开和头文件包含的预处理逻辑?
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)
  • 【深度学习】多目标融合算法(六):渐进式分层提取模型PLE(Progressive Layered Extraction)
  • 两个重要的alpha表达式
  • 三维表面轮廓仪的维护保养是确保其长期稳定运行的关键
  • 高速串行差分信号仿真分析及技术发展挑战
  • sqlsugar查看表结构并导出word文档