C# 如何在LINQ中使用GroupBy查找缺少的项目?

C# 如何在LINQ中使用GroupBy查找缺少的项目?,c#,linq,C#,Linq,我有一个这样的场景,我有一个这些项目的集合 public class Submission { public DateTime ProcessedDate { get; set; } public string UserName { get; set; } } 我需要对照用户名集合进行检查,例如: string[] names = new string{"Paul", "John", "George", "Ringo"}; 我想找出缺少提交的日期(并非所有用户名都有条目的日期

我有一个这样的场景,我有一个这些项目的集合

public class Submission {
    public DateTime ProcessedDate { get; set; }
    public string UserName { get; set; }
}
我需要对照用户名集合进行检查,例如:

string[] names = new string{"Paul", "John", "George", "Ringo"};
我想找出缺少提交的日期(并非所有用户名都有条目的日期)。想象一下测试数据,比如:

var submissions = new List<Submission>();
submissions.Add(new Submission() { ProcessedDate = new DateTime(2018, 1, 1), UserName = "Paul" });
submissions.Add(new Submission() { ProcessedDate = new DateTime(2018, 1, 1), UserName = "John" });
submissions.Add(new Submission() { ProcessedDate = new DateTime(2018, 1, 1), UserName = "George" });
submissions.Add(new Submission() { ProcessedDate = new DateTime(2018, 1, 1), UserName = "Ringo" });
submissions.Add(new Submission() { ProcessedDate = new DateTime(2018, 1, 2), UserName = "Paul" });
submissions.Add(new Submission() { ProcessedDate = new DateTime(2018, 1, 2), UserName = "John" });
submissions.Add(new Submission() { ProcessedDate = new DateTime(2018, 1, 3), UserName = "George" });
submissions.Add(new Submission() { ProcessedDate = new DateTime(2018, 1, 3), UserName = "Ringo" });
var提交=新列表();
submissions.Add(newsubmission(){ProcessedDate=new DateTime(2018,1,1),UserName=“Paul”});
Add(new Submission(){ProcessedDate=new DateTime(2018,1,1),UserName=“John”});
submissions.Add(newsubmission(){ProcessedDate=new DateTime(2018,1,1),UserName=“George”});
Add(new Submission(){ProcessedDate=new DateTime(2018,1,1),UserName=“Ringo”});
Add(new Submission(){ProcessedDate=new DateTime(2018,1,2),UserName=“Paul”});
Add(new Submission(){ProcessedDate=new DateTime(2018,1,2),UserName=“John”});
Add(new Submission(){ProcessedDate=new DateTime(2018,1,3),UserName=“George”});
Add(new Submission(){ProcessedDate=new DateTime(2018,1,3),UserName=“Ringo”});
1/1已提交所有用户名,但1/2和1/3都是缺失条目,如何返回缺失条目的集合(缺失日期和该日期缺失的用户)

2018-01-02-乔治,林戈


2018-01-03-约翰·保罗

我想你要找的是:

var result = submissions
                 .GroupBy(s => s.ProcessedDate)
                 .Select(g => new { Date = g.Key, Names = names.Except(g.Select(s => s.UserName)) })
                 .Where(g => g.Names.Any());

如果只需要日期,请使用以下查询:

var result = submissions.GroupBy(o => o.ProcessedDate)
    .Where(o => names.Any(x => !o.Any(s => s.UserName == x)))
    .Select(o => o.Key)
    .ToList();
var resultWithMissingNames = submissions.GroupBy(o => o.ProcessedDate)
    .Where(o => names.Any(x => !o.Any(s => s.UserName == x)))
    .Select(o => new { ProcessedDate = o.Key, MissingNames = string.Join(",", names.Except(o.Select(x => x.UserName)))})
    .ToList();
如果需要
提交
对象列表,请使用此列表:

var resultWithSubmissions = submissions.GroupBy(o => o.ProcessedDate)
    .Where(o => names.Any(x => !o.Any(s => s.UserName == x)))
    .SelectMany(o => o)
    .ToList();
如果需要每个日期缺少用户名的列表,请使用以下查询:

var result = submissions.GroupBy(o => o.ProcessedDate)
    .Where(o => names.Any(x => !o.Any(s => s.UserName == x)))
    .Select(o => o.Key)
    .ToList();
var resultWithMissingNames = submissions.GroupBy(o => o.ProcessedDate)
    .Where(o => names.Any(x => !o.Any(s => s.UserName == x)))
    .Select(o => new { ProcessedDate = o.Key, MissingNames = string.Join(",", names.Except(o.Select(x => x.UserName)))})
    .ToList();
此方法按日期对提交进行分组,并使用匿名类型存储有关日期和缺少用户的信息。
然后过滤此结果以删除没有遗漏学生的日期,然后作为字典返回。

GroupBy
日期,然后检查每个组,查看是否有
的任何
结果,只有
@maccettura可以一行完成吗?我试图将查询可视化,但我一直在筛选GroupBy的结果。日期范围呢??。。它将如何返回此用户丢失的信息date@PranayRana“并非所有这些用户名都有条目的日期”我想它们都在收藏中,它将如何返回这件东西
2018-01-02-乔治,林戈,2018-01-03-保罗,约翰
,我只是想知道…用户在给定的一天中的MSS将是怎样的printed@vc74:如果集合为空怎么办?那么每个用户在每个日期都提交了吗?如果有差距呢?撇开这一点不谈,它不会显示如何找到丢失的日期和用户。@TimSchmelter如果提交的
为空,则没有任何内容可分组,并且
结果将是一个空的可枚举项,或者我遗漏了什么?其他一些不错的答案,但这正是我想要的,做得好!