C#如何使用Lambda表达式简化请求响应数据匹配筛选代码
C# Lambda表达式简化集合筛选实现
完全可以通过LINQ Lambda表达式替代手写foreach+硬编码判断的逻辑,代码更简洁,也更容易维护。
实现注意事项
- 提前引入LINQ命名空间:
using System.Linq; - 响应返回的两类数据对象存储校验数组的字段名不同(一类为
array、一类为agreements),需要做兼容处理,避免空引用异常 - 校验前先判断数组长度≥4,避免索引越界报错
- 核心匹配规则:数组前4个元素的
Value属性,依次与参数字典中键为"7"/"8"/"9"/"10"的值做等值比较
代码实现
版本1:完全对齐原有硬编码逻辑
直接按索引取前4位做匹配,和你现有逻辑完全一致,性能更高:
// 核心筛选逻辑直接链式调用完成,无需手写foreach循环和逐行Add操作 List<user_model> list2 = list .Where(user => { // 兼容两种数组字段,空值兜底为空数组 var targetArr = user.array ?? user.agreements ?? Array.Empty<CodeItem>(); // 长度不足直接判定不匹配 if (targetArr.Length < 4) return false; // 依次匹配对应位置的值 return targetArr[0].Value == param["7"] && targetArr[1].Value == param["8"] && targetArr[2].Value == param["9"] && targetArr[3].Value == param["10"]; }) .ToList();
上述代码中
CodeItem是你定义的携带GroupID/CodeID/Value属性的数组项实体类,替换成你项目里的实际类名即可。
版本2:高鲁棒性优化版
不依赖数组的返回顺序,直接按CodeID匹配固定的ONE/TWO/THREE/FOUR四个条目做校验,哪怕后续接口调整数组内条目顺序,也不会出现匹配错误,更适合生产环境使用:
List<user_model> list2 = list .Where(user => { var targetArr = user.array ?? user.agreements ?? Array.Empty<CodeItem>(); // 按CodeID查找对应校验项 var itemOne = targetArr.FirstOrDefault(i => i.CodeID == "ONE"); var itemTwo = targetArr.FirstOrDefault(i => i.CodeID == "TWO"); var itemThree = targetArr.FirstOrDefault(i => i.CodeID == "THREE"); var itemFour = targetArr.FirstOrDefault(i => i.CodeID == "FOUR"); // 任意一个固定项不存在直接判定不匹配 if (itemOne == null || itemTwo == null || itemThree == null || itemFour == null) return false; // 匹配对应参数值 return itemOne.Value == param["7"] && itemTwo.Value == param["8"] && itemThree.Value == param["9"] && itemFour.Value == param["10"]; }) .ToList();
内容的提问来源于stack exchange,提问作者totmoto
相关产品推荐
相关产品推荐

