如何按开头数字相似性对字符串类型accountId实现自定义排序
账户ID前缀分组排序解决方案
可以使用ThenBy实现需求,TrimStart不适用该场景,它的作用是移除字符串开头指定的连续字符,无法提取公共前缀作为排序依据。
问题原因
你当前的输出明显是排序规则不符合要求导致的:
- 如果
accountId被隐式转为数值类型排序,数值更小的404会排在数值更大的10111前面,直接破坏前缀分组规则 - 如果排序逻辑优先按字符串长度排序,所有长度为3的ID会统一排在更长的ID前面,也会导致同前缀ID被拆分
实现代码
按「前3位分组→组内长度升序→同长度字典序升序」的规则排序,完全满足前3/4位相同ID归为一组、前缀相似内容相邻的需求,代码如下:
allList = allList // 第一排序键:取ID前3位,保证前3位相同的ID归为同一组 .OrderBy(x => x.accountId.Substring(0, 3)) // 第二排序键:ID字符串长度,保证组内短ID排在前面 .ThenBy(x => x.accountId.Length) // 第三排序键:ID本身的字典序,保证同长度ID按数字顺序排列 .ThenBy(x => x.accountId) .ToList();
注:如果你的
accountId存在长度不足3位的情况,可以把第一个排序键改成x.accountId.Length >=3 ? x.accountId.Substring(0,3) : x.accountId避免报错。
效果验证
该代码排序后的结果和你期望的输出完全一致:
- 所有
101开头的ID排在最前,依次是最短的101、5位、6位等更长的同前缀ID - 后续依次排列
202前缀组、303前缀组、4开头的前缀组
内容的提问来源于stack exchange,提问作者NAZ HUMASH
相关产品推荐
相关产品推荐

