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

