LINQ中做Substring/Split操作处理IFormCollection键触发索引越界错误如何解决
LINQ提取表单键后缀触发错误的原因
核心错误原因
- 索引越界异常:你的LINQ语句直接调用
w.Key.Split("-")[1],如果存在不包含-字符的表单键,Split返回的数组长度不足2,直接取下标1会抛出IndexOutOfRangeException。IFormCollection中通常会包含部分无-后缀的系统自带键,或者提交时的残缺键,都会触发该错误。 - 匹配逻辑错误:如果表单键包含多个
-字符(比如QuestionHint-0-guid),取下标1的结果不是你要的序号后缀,会出现匹配失败或者匹配错误的问题。 - 重复插入问题:你在
foreach (var item in GroupedIForm)循环内执行pas.Add(pa),会导致同一个PostAssignment实例被添加多次(次数等于当前表单的键数量),最终数据库会插入重复的模型数据,和你提到的重复返回两次的现象完全吻合。
修复方案
首先修改LINQ语句,增加安全校验,用取最后一段的方式适配多-的场景:
// 先执行ToList触发立即执行,避免延迟执行带来的重复计算问题 var GroupedIForm = data.Where(w => w.Key.Contains('-') && w.Key.Split('-').Last().Equals(FormId.ToString(), StringComparison.Ordinal) ).ToList();
然后将pas.Add(pa)移动到foreach循环外面,每个表单只添加一次模型:
foreach (var item in GroupedIForm) { // 你的赋值业务逻辑保留 } // 每个表单处理完成后只添加一次 pas.Add(pa);
内容的提问来源于stack exchange,提问作者MOHAMED ABUELATTA
相关产品推荐
相关产品推荐

