C#对象数组索引失效,求Path方法逻辑优化方案
问题分析
你的问题出在原方法的替换逻辑上:它只循环处理了indexes数组里存在的索引(比如示例里只处理#0),但对于那些#后面的数字超出indexes长度的占位符(比如#1、#2)完全没处理,导致结果里还保留着#符号,不符合预期。
核心规则梳理:
- 对于
#n格式的占位符,如果n是indexes数组的有效索引(即n < indexes.Length),就用indexes[n]的值替换(数字类型直接转字符串,非数字类型需包裹单引号) - 如果
n超出indexes的长度,就去掉#,保留n本身的数字
优化后的实现
我们可以借助正则表达式匹配所有#(\d+)格式的占位符,然后逐个处理每个匹配项,完美覆盖所有场景:
using System.Text.RegularExpressions; public static class Tokenizer { public static string Path(string objectPath, object[] indexes) { if (string.IsNullOrEmpty(objectPath)) return objectPath; // 匹配所有"#数字"格式的占位符,捕获数字部分 return Regex.Replace(objectPath, @"#(\d+)", match => { // 尝试将捕获的数字转为整数 if (int.TryParse(match.Groups[1].Value, out int n)) { // 检查当前n是否在indexes的有效范围内 if (indexes != null && n < indexes.Length) { var val = indexes[n]; // 数字类型直接转字符串,其他类型添加单引号包裹 return val is int ? val.ToString() : $"'{val}'"; } // 超出indexes长度时,去掉#保留原数字 return match.Groups[1].Value; } // 若捕获的内容不是有效数字,保留原占位符内容 return match.Value; }); } }
测试验证
用你给出的示例输入测试:
string objectPath = "RiskItems[#0].Coverages[#1].QuestionAnswer[#2]"; object[] indexes = new Object[] { 8 }; var result = Tokenizer.Path(objectPath, indexes); // 输出结果:"RiskItems[8].Coverages[1].QuestionAnswer[2]",完全符合预期
逻辑说明
- 正则匹配:通过
@"#(\d+)"精准匹配所有#后跟数字的占位符,并将数字部分单独捕获 - 动态处理每个占位符:
- 先尝试把捕获的数字转为整数
n,确保格式合法 - 若
n在indexes的有效索引范围内,按规则替换为对应值(区分数字/非数字格式) - 若
n超出indexes长度,直接返回原数字(去掉#) - 遇到非法格式(比如
#abc)时,保留原内容避免破坏路径结构
- 先尝试把捕获的数字转为整数
内容的提问来源于stack exchange,提问作者Meena
相关产品推荐
相关产品推荐

