如何按子串对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
相关产品推荐
相关产品推荐

