You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按子串对C#字符串列表排序并达成指定排序结果?

C# 字符串列表按年份+序号排序问题解决

问题场景

有一组格式为N[数字] [年份]的字符串列表,需要实现先按年份升序,同一年份下按N后的数字升序排序,但初始代码的输出不符合预期。

初始代码:

List<string> strings = new List<string>() { "N3 2021","N4 2021","N1 2022","N2 2022","N4 2022","N3 2022","N2 2023","N1 2023","N3 2023"};

var orderedList = strings.OrderBy(x => x.Substring(2).Trim()).ToList();

Console.WriteLine(String.Join(", ", orderedList));

当前输出:

N3 2021, N4 2021, N1 2022, N2 2022, N4 2022, N3 2022, N2 2023, N1 2023, N3 2023

期望输出:

N3 2021, N4 2021, N1 2022, N2 2022, N3 2022, N4 2022, N1 2023, N2 2023, N3 2023

问题原因

初始代码仅通过x.Substring(2).Trim()提取年份作为排序依据,当多个元素年份相同时,LINQ的OrderBy会保留元素在原列表中的相对顺序(稳定排序特性),但原列表中同一年份的元素序号并未按从小到大排列,导致最终输出不符合预期。

解决方案

在按年份排序后,追加ThenBy对同一年份的元素按原字符串的字典序排序(N1、N2、N3的字典序与数字升序一致),即可得到期望的排序结果:

List<string> strings = new List<string>() { "N3 2021","N4 2021","N1 2022","N2 2022","N4 2022","N3 2022","N2 2023","N1 2023","N3 2023"};

var orderedList = strings.OrderBy(x => x.Substring(2).Trim()).ThenBy(y => y).ToList();

Console.WriteLine(String.Join(", ", orderedList));

进阶优化(适用于复杂格式)

如果字符串格式可能发生变化(比如N后面的数字是多位数),更严谨的做法是拆分出年份和数字部分,转为数值类型后排序,避免字典序带来的误差:

var orderedList = strings.OrderBy(s => int.Parse(s.Split(' ')[1]))
                         .ThenBy(s => int.Parse(s.Split(' ')[0].Substring(1)))
                         .ToList();

内容的提问来源于stack exchange,提问作者MMK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:06:27