You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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查询逻辑来了,我给你拆解下每一步的作用:

  1. 按提交日期分组(只取日期部分,避免时间戳干扰)
  2. 对每个日期组,计算用户名单中未出现在当天提交里的用户(也就是缺失提交的用户)
  3. 过滤掉没有缺失用户的日期(比如2018-01-01)
  4. 整理成包含日期和缺失用户列表的结果集
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:53:45