编写LINQ查询筛选符合条件的索引记录存入_wIndex,解决调试卡点问题
现有代码问题定位
- 冗余嵌套引发执行卡顿:原LINQ在
Where条件中嵌套了对全量_wIndex集合的Any遍历,但内层遍历的p1变量完全没有被用到,所有判断逻辑都只针对外层遍历的p2。这种写法会把原本O(n)的单次过滤变成O(n²)的双层遍历,当索引文件存储的记录数较多时,会直接出现程序卡在查询行无响应的情况。 - 属性名不匹配触发运行异常:原判断逻辑中引用了
p2.WbNewestDrlPmtNbr字段,但WIndex类的定义中不存在该字段,实际对应的字段是DpNbr,这会直接触发编译报错或运行时空引用异常。 - 自遍历存在潜在风险:原代码将反序列化得到的
_wIndex直接作为过滤源,遍历过程中替换集合引用的操作可能引发枚举源被修改的运行时异常。
修正实现代码
private List<WIndex> _wIndex; private readonly string _FilePath; internal const string _Key = "Test"; // 读取索引文件并反序列化得到全量原始索引数据 string idxData = File.ReadAllText(Path.Combine(_FilePath, _Key + ".ind")); List<WIndex> rawIndexSource = JsonConvert.DeserializeObject<List<WIndex>>(idxData); // 按规则过滤符合条件的记录,结果赋值给_wIndex _wIndex = rawIndexSource .Where(item => (item.CompRecordPosition == 0 && item.DpNbr != 0) || item.CompRecordPosition != 0 ) .ToList();
规则匹配验证(对照提供的示例数据)
- 第一条示例记录:
CompRecordPosition = 567(非0),满足CompRecordPosition != 0的分支规则,会被保留 - 第二条示例记录:
CompRecordPosition = 0且DPNbr = 810(非0),满足CompRecordPosition == 0 && DpNbr != 0的分支规则,会被保留 - 若存在
CompRecordPosition = 0且DPNbr = 0的无效记录,会被直接过滤,完全匹配需求的筛选逻辑。
内容的提问来源于stack exchange,提问作者Anjana Jain
相关产品推荐
相关产品推荐

