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

如何对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);
}

方案优势

  1. 高效低耗:原地排序,避免Enumerable方案产生的额外内存占用,适合大规模字符串列表
  2. 无需转换:直接操作原字符串列表,无需将字符串映射为自定义类,简化实现
  3. 扩展性强:后续新增其他楼层的特殊排序规则,只需在比较器中添加对应分支即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:23:15