使用Linq按Email分组校验用户所有考试是否全部通过的实现问题
解决方案
你可以直接使用LINQ的All()方法实现需求,分组后校验同邮箱下所有考试记录的Passed字段是否均为Yes即可。
场景1:仅筛选全部考试通过的用户
var certifiedUsers = p.GroupBy(s => s.Email) // 校验同邮箱下所有考试是否全部通过 .Where(group => group.All(exam => exam.Passed == "Yes")) // 取同邮箱下任意一条记录作为用户基础信息 .Select(group => group.First()) .ToList();
场景2:获取所有用户的拿证资格状态
如果你需要保留所有用户,同时标记是否符合拿证要求,可以用如下写法,还能额外统计考试总数、通过数:
var userCertificationStatus = p.GroupBy(s => s.Email) .Select(group => new { UserBaseInfo = group.First(), // 是否具备拿证资格 IsCertified = group.All(exam => exam.Passed == "Yes"), // 总考试门数 TotalExamCount = group.Count(), // 通过的考试门数 PassedExamCount = group.Count(exam => exam.Passed == "Yes") }) .ToList();
优化建议
判断Passed字段时建议增加不区分大小写的逻辑,避免原始数据出现yes/YES这类格式差异导致判断错误:
group.All(exam => exam.Passed.Equals("Yes", StringComparison.OrdinalIgnoreCase))
内容的提问来源于stack exchange,提问作者Joao Livio
相关产品推荐
相关产品推荐

