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

C# LINQ与模式匹配挑战:固定长度字符串规则校验优化需求

优化固定长度字符串规则校验方案

嘿,我完全懂你的困扰——当前方案虽然能定位到不符合的规则,但没法直接获取对应位置的实际值,而且用Tuple搭配Dictionary的写法确实不够直观,后续维护起来也麻烦。咱们来重构一下,让这个校验逻辑更清晰、更实用,完美满足你要收集「失败规则ID+预期值+实际值」的需求!

优化思路

核心就是把分散的规则信息封装成一个清晰的模型,然后在校验过程中直接提取实际值,最后把所有失败的规则详情收集起来:

  • 定义一个ValidationRule类,统一封装规则ID、起始位置、预期值,让规则结构一目了然;
  • 遍历规则时,直接从目标字符串中提取对应位置的实际值,和预期值对比;
  • 把所有不匹配的规则(带上完整的规则ID、预期值、实际值)整理成结果集,方便后续使用或展示。

完整代码实现

1. 定义规则模型

public class ValidationRule
{
    // 规则唯一标识
    public string RuleId { get; set; }
    // 字符串中的起始位置
    public int StartPosition { get; set; }
    // 预期的固定长度值
    public string ExpectedValue { get; set; }
}

2. 初始化规则与目标字符串

// 需要校验的固定长度字符串
var actualString = "628IDENTREGISTER153004085616P30062010EAPFEMPA013.1";

// 初始化规则列表,结构清晰,易维护
var validationRules = new List<ValidationRule>
{
    new ValidationRule { RuleId = "900052", StartPosition = 0, ExpectedValue = "628" },
    new ValidationRule { RuleId = "9000250", StartPosition = 3, ExpectedValue = "IDENTREGISTER1" },
    new ValidationRule { RuleId = "900092", StartPosition = 17, ExpectedValue = "53004085616" },
    new ValidationRule { RuleId = "900004", StartPosition = 28, ExpectedValue = "P" },
    new ValidationRule { RuleId = "900089", StartPosition = 29, ExpectedValue = "30062010" },
    new ValidationRule { RuleId = "900028", StartPosition = 37, ExpectedValue = "E" },
    new ValidationRule { RuleId = "900029", StartPosition = 38, ExpectedValue = "A" },
    new ValidationRule { RuleId = "900002", StartPosition = 39, ExpectedValue = "P" },
    new ValidationRule { RuleId = "900030", StartPosition = 40, ExpectedValue = "FEMPA013.0" }
};

3. 执行校验并收集失败规则

// 遍历所有规则,提取实际值并对比,收集失败的规则详情
var failedRules = validationRules
    .Select(rule => new
    {
        Rule = rule,
        // 从目标字符串中提取对应位置的实际值(长度和预期值一致)
        ActualValue = actualString.Substring(rule.StartPosition, rule.ExpectedValue.Length)
    })
    .Where(checkResult => !checkResult.ActualValue.Equals(checkResult.Rule.ExpectedValue))
    .Select(failedCheck => new
    {
        RuleId = failedCheck.Rule.RuleId,
        ExpectedValue = failedCheck.Rule.ExpectedValue,
        ActualValue = failedCheck.ActualValue,
        StartPosition = failedCheck.Rule.StartPosition
    })
    .ToList();

4. 输出失败规则详情

foreach (var failedRule in failedRules)
{
    Console.WriteLine($"❌ 规则ID: {failedRule.RuleId}");
    Console.WriteLine($"   预期值: {failedRule.ExpectedValue}");
    Console.WriteLine($"   实际值: {failedRule.ActualValue}");
    Console.WriteLine($"   起始位置: {failedRule.StartPosition}\n");
}

输出结果示例

运行后会得到清晰的失败规则信息:

❌ 规则ID: 900030
   预期值: FEMPA013.0
   实际值: FEMPA013.1
   起始位置: 40

方案优势

  • 可读性强:用类封装规则信息,比Tuple+Dictionary的组合直观太多,后续修改规则也不容易出错;
  • 信息完整:直接获取实际值,完美解决你当前方案的痛点;
  • 扩展性高:如果以后需要添加规则描述、数据类型校验(比如数字格式),直接给ValidationRule类加属性即可,核心校验逻辑不用大改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:09:15