使用LINQ删除与指定列表不匹配的Order记录的错误排查
代码错误排查:移除订单列表中不匹配原因的记录
问题场景
现有逗号分隔的字符串变量ReasonsToShow(示例值:Q12,Q14,.),需将其拆分为原因列表,然后删除Order列表中订单原因不在该列表内的记录。现有代码如下:
var Reasons = ReasonsToShow?.Split(',').ToList(); order.RemoveAll(r => Reasons.Any(x => x != r.OrderReason));
错误分析
- 空引用风险:如果
ReasonsToShow为null,Reasons会被赋值为null,后续调用Reasons.Any()会直接抛出空引用异常。 - 逻辑完全反转:当前
RemoveAll的条件Reasons.Any(x => x != r.OrderReason)表示“只要原因列表里存在任意一个元素不等于当前订单的原因”,这几乎对所有订单都成立(除非所有原因都和订单原因完全一致,显然不符合需求),最终会把所有订单都删除。正确逻辑应该是判断订单原因不在目标原因列表中。 - 未处理空项:直接用
Split(',')拆分可能产生空字符串(比如ReasonsToShow末尾带逗号时),这些空值会干扰后续的匹配判断。
修正后的代码
// 处理空值,同时移除拆分后产生的空项 var reasons = ReasonsToShow?.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List<string>(); // 移除订单原因不在目标列表中的记录 order.RemoveAll(r => !reasons.Contains(r.OrderReason));
内容的提问来源于stack exchange,提问作者user2432361
相关产品推荐
相关产品推荐

