如何对List<string>类型的位置编码实现自定义规则排序?
自定义位置编码字符串列表排序方案
问题背景
我有一个List<string>,其中元素为类似“010101”“010102”“010201”的位置编码,编码各部分含义:
- 前两位:楼层
- 中间两位:通道
- 最后两位:通道内编号
常规排序后的列表如下:
010101 010102 010103 010201 010202 020101 020102 020201 020202 020203 020204 ...
需求的自定义排序规则
- 楼层“01”:按常规顺序排序(楼层→通道→通道内编号正序),示例:
010101 010102 010103 010201 010202 - 楼层“02”:按通道倒序、通道内编号正序排序,示例:
... 020201 020202 020203 020204 020101 020102
此前找到的IEnumerable方案仅适用于自定义类的List<T>,不适用于字符串列表;Enumerable方案因字符串数量过大时内存开销高不可行,需要灵活高效的解决方案。
解决方案:使用List.Sort自定义比较器
直接利用List<T>.Sort方法的自定义比较器实现,原地排序内存开销低,适合大数据量场景,无需转换为自定义类:
var locationCodes = new List<string> { "010101", "010102", "010103", "010201", "010202", "020101", "020102", "020201", "020202", "020203", "020204" }; // 自定义排序比较器 locationCodes.Sort((a, b) => { // 提取两个编码的楼层部分 string floorA = a.Substring(0, 2); string floorB = b.Substring(0, 2); // 先按楼层排序,01优先于02 int floorCompare = string.Compare(floorA, floorB); if (floorCompare != 0) { return floorCompare; } // 处理同一楼层的排序逻辑 if (floorA == "01") { // 01楼层:通道正序,通道内编号正序 string corridorA = a.Substring(2, 2); string corridorB = b.Substring(2, 2); int corridorCompare = string.Compare(corridorA, corridorB); if (corridorCompare != 0) { return corridorCompare; } return string.Compare(a.Substring(4, 2), b.Substring(4, 2)); } else if (floorA == "02") { // 02楼层:通道倒序,通道内编号正序 string corridorA = a.Substring(2, 2); string corridorB = b.Substring(2, 2); int corridorCompare = string.Compare(corridorB, corridorA); // 倒序比较 if (corridorCompare != 0) { return corridorCompare; } return string.Compare(a.Substring(4, 2), b.Substring(4, 2)); } // 其他楼层默认按字符串原序排序 return string.Compare(a, b); }); // 输出验证结果 foreach (var code in locationCodes) { Console.WriteLine(code); }
方案优势
- 高效低耗:原地排序,避免Enumerable方案产生的额外内存占用,适合大规模字符串列表
- 无需转换:直接操作原字符串列表,无需将字符串映射为自定义类,简化实现
- 扩展性强:后续新增其他楼层的特殊排序规则,只需在比较器中添加对应分支即可
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

