如何通过LINQ的GroupBy查找缺失提交记录的日期及对应用户?
解决思路与代码实现
没问题,我来帮你搞定这个需求!咱一步步来,先把基础定义和测试数据搭好,再用LINQ实现核心逻辑。
首先是基础类和用户名单的定义,完全贴合你的需求:
// 定义Submission类,包含指定属性 public class Submission { public DateTime ProcessedDate { get; set; } public string UserName { get; set; } } // 固定用户名单数组 string[] names = new string[] { "Paul", "John", "George", "Ringo" };
接下来构造符合你描述的测试数据集,模拟不同日期的提交情况(2018-01-01全提交,02、03有缺失):
// 构造测试用submissions集合 var submissions = new List<Submission> { // 2018-01-01 所有用户均提交 new Submission { ProcessedDate = new DateTime(2018, 1, 1), UserName = "Paul" }, new Submission { ProcessedDate = new DateTime(2018, 1, 1), UserName = "John" }, new Submission { ProcessedDate = new DateTime(2018, 1, 1), UserName = "George" }, new Submission { ProcessedDate = new DateTime(2018, 1, 1), UserName = "Ringo" }, // 2018-01-02 缺失Paul、George的提交 new Submission { ProcessedDate = new DateTime(2018, 1, 2), UserName = "John" }, new Submission { ProcessedDate = new DateTime(2018, 1, 2), UserName = "Ringo" }, // 2018-01-03 缺失John的提交 new Submission { ProcessedDate = new DateTime(2018, 1, 3), UserName = "Paul" }, new Submission { ProcessedDate = new DateTime(2018, 1, 3), UserName = "George" }, new Submission { ProcessedDate = new DateTime(2018, 1, 3), UserName = "Ringo" } };
核心的LINQ查询逻辑来了,我给你拆解下每一步的作用:
- 按提交日期分组(只取日期部分,避免时间戳干扰)
- 对每个日期组,计算用户名单中未出现在当天提交里的用户(也就是缺失提交的用户)
- 过滤掉没有缺失用户的日期(比如2018-01-01)
- 整理成包含日期和缺失用户列表的结果集
var missingSubmissions = submissions .GroupBy(s => s.ProcessedDate.Date) // 按日期分组,忽略具体时间 .Select(g => new { Date = g.Key, MissingUsers = names.Except(g.Select(s => s.UserName)).ToList() }) .Where(result => result.MissingUsers.Any()) // 只保留存在缺失的日期 .ToList();
如果要验证结果,可以加一段输出代码:
// 遍历输出结果 foreach (var item in missingSubmissions) { Console.WriteLine($"日期: {item.Date:yyyy-MM-dd}"); Console.WriteLine("缺失提交的用户: " + string.Join(", ", item.MissingUsers)); Console.WriteLine("---"); }
这段代码的输出会是:
日期: 2018-01-02 缺失提交的用户: Paul, George --- 日期: 2018-01-03 缺失提交的用户: John ---
关键细节说明
- 用
ProcessedDate.Date分组是为了统一处理带时间的提交记录,确保同一天的提交不会被拆分 names.Except(...)是LINQ的集合差集操作,能高效找出用户名单中未提交的用户,比手动遍历判断简洁很多- 最后的
Where过滤可以帮我们直接排除掉没有缺失的日期,只保留需要关注的结果
内容的提问来源于stack exchange,提问作者snappymcsnap
相关产品推荐
相关产品推荐

