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

C#道路编号解析类属性Getter/Setter实现方案问询

C# 道路编号解析类实现

直接给出符合需求的类实现,核心保证属性同步更新的一致性,同时兼顾解析逻辑的清晰性:

public class RoadNumber
{
    // 可读写的道路编号公共属性
    public string RdNumber
    {
        get => _rdNumber;
        set
        {
            _rdNumber = value?.Trim().ToUpperInvariant() ?? string.Empty;
            ParseComponents();
        }
    }

    // 只读前缀属性
    public char Prefix { get; private set; }
    // 只读数字部分(转为整数,方便数值排序)
    public int NumericPart { get; private set; }
    // 只读后缀属性(无后缀时为'\0')
    public char Suffix { get; private set; }

    private string _rdNumber;

    // 核心解析方法,仅在RdNumber赋值时触发
    private void ParseComponents()
    {
        // 重置默认值,避免旧数据残留
        Prefix = '\0';
        NumericPart = 0;
        Suffix = '\0';

        if (string.IsNullOrEmpty(_rdNumber))
            return;

        // 提取前缀(固定为第一个字符)
        Prefix = _rdNumber[0];

        // 根据长度分支处理
        switch (_rdNumber.Length)
        {
            case 5:
                // 格式:前缀+4位数字,无后缀
                int.TryParse(_rdNumber.Substring(1, 4), out NumericPart);
                break;
            case 6:
                // 两种可能:前缀+4位数字+后缀 / 前缀+5位数字
                char lastChar = _rdNumber[5];
                if (char.IsLetter(lastChar))
                {
                    // 匹配前缀+4位数字+后缀
                    int.TryParse(_rdNumber.Substring(1, 4), out NumericPart);
                    Suffix = lastChar;
                }
                else
                {
                    // 匹配前缀+5位数字
                    int.TryParse(_rdNumber.Substring(1, 5), out NumericPart);
                }
                break;
            case 7:
                // 格式:前缀+5位数字+后缀
                int.TryParse(_rdNumber.Substring(1, 5), out NumericPart);
                Suffix = _rdNumber[6];
                break;
            default:
                // 非法长度,可根据需求添加异常抛出逻辑
                break;
        }
    }
}

关键设计说明

  • 作用域一致性:三个只读属性的赋值完全由ParseComponents方法控制,而该方法仅在RdNumber的setter中被调用,确保每次RdNumber更新时,解析属性都会同步刷新,绝不会出现数据不一致的情况。
  • 鲁棒性处理:自动去除输入空格并统一转为大写,避免大小写、空格差异影响后续排序;输入为空或非法格式时,会重置解析属性为默认值。
  • 排序友好性:将数字部分转为int类型,后续排序时直接按数值比较,比字符串排序更精准。

自定义排序示例

配合IComparer实现自定义排序逻辑:

public class RoadNumberComparer : IComparer<RoadNumber>
{
    public int Compare(RoadNumber x, RoadNumber y)
    {
        if (x == null && y == null) return 0;
        if (x == null) return -1;
        if (y == null) return 1;

        // 优先级:前缀 > 数字部分 > 后缀
        int prefixCompare = x.Prefix.CompareTo(y.Prefix);
        if (prefixCompare != 0) return prefixCompare;

        int numCompare = x.NumericPart.CompareTo(y.NumericPart);
        if (numCompare != 0) return numCompare;

        return x.Suffix.CompareTo(y.Suffix);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:42:22