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
相关产品推荐
相关产品推荐

