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

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]",完全符合预期
逻辑说明
  1. 正则匹配:通过@"#(\d+)"精准匹配所有#后跟数字的占位符,并将数字部分单独捕获
  2. 动态处理每个占位符:
    • 先尝试把捕获的数字转为整数n,确保格式合法
    • 若n在indexes的有效索引范围内,按规则替换为对应值(区分数字/非数字格式)
    • 若n超出indexes长度,直接返回原数字(去掉#)
    • 遇到非法格式(比如#abc)时,保留原内容避免破坏路径结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:59:06