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

LINQ连接Programmes列表时处理带-R引用遇Length不能小于0错误求助

解决LINQ连接时的"Length cannot be less than zero"错误及匹配逻辑实现

问题场景

需要通过Programme Reference字段用LINQ连接两个Programmes列表:

  • List A的引用可能末尾带"-R",且同一条记录可能同时存在带"-R"和不带"-R"的条目
  • List B的引用绝不会带"-R"
    当前代码运行时抛出"Length cannot be less than zero."错误,目标是实现:List A的引用若末尾带"-R"则取前面的内容,否则直接用原引用,完成列表连接。

错误原因

当前代码中使用programmeA.REFERENCE.IndexOf("-R"),当引用不含"-R"时,IndexOf返回-1,此时调用Substring(0, -1)会触发参数异常——因为Substring的长度参数不能小于0。

解决方案

方案1:用EndsWith判断后缀(高效直接)

直接检查引用是否以"-R"结尾,是则截取掉最后两位,否则返回原引用:

var combinedList = from programmeA in ListA
                   join programmeB in ListB on 
                       (programmeA?.REFERENCE != null && programmeA.REFERENCE.EndsWith("-R") 
                           ? programmeA.REFERENCE.Substring(0, programmeA.REFERENCE.Length - 2) 
                           : programmeA?.REFERENCE ?? string.Empty) 
                   equals programmeB?.REFERENCE ?? string.Empty
                   select new Programme()
                   {
                       // 按需填充Programme的属性
                   };

方案2:用正则替换末尾的"-R"(灵活可扩展)

如果后续可能有类似后缀规则,用正则替换末尾的"-R"更灵活:

using System.Text.RegularExpressions;

// 封装清理引用的方法
private string CleanProgrammeReference(string reference)
{
    if (string.IsNullOrWhiteSpace(reference))
        return string.Empty;
    // 匹配末尾的"-R"并替换为空
    return Regex.Replace(reference, "-R$", string.Empty);
}

// LINQ查询调用方法
var combinedList = from programmeA in ListA
                   join programmeB in ListB on CleanProgrammeReference(programmeA?.REFERENCE) equals programmeB?.REFERENCE ?? string.Empty
                   select new Programme()
                   {
                       // 按需填充Programme的属性
                   };

说明

两种方案都能避免原代码的异常问题,同时准确实现匹配逻辑:

  • 方案1性能更优,适合仅处理"-R"后缀的场景
  • 方案2更灵活,若后续需要修改后缀规则(比如支持"-V"等),只需调整正则表达式即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:53:13