分组项目并删除其中一些

时间:2018-06-26 21:07:13

标签: c# linq

我有一个以下列表项,我想删除ClassNameStartDate相同的类。我要删除Status为“旧”的项目。

CourseId    ClassName    StartDate    Status
--------    --------      --------   ---------
12321       Math         08-25-2017    New
14321       Math         08-25-2017    Old
13221       Math         08-25-2017    Old
32342       Physics      08-25-2017    New
34345       Math         08-25-2017    New
25325       Math         01-25-2018    New
45329       Math         01-25-2018    Old 
33325       Chemistry    01-25-2018    New      
44345       Chemistry    01-25-2018    Old

例如,下面有两个数学课程的开始日期是相同的,但是我要删除第二个和第三个,因为状态是旧的,并且想要保留第一个和第三个,状态是新的。

12321       Math         08-25-2017    New
14321       Math         08-25-2017    Old
13221       Math         08-25-2017    Old

尝试按如下所示根据日期和类名对它们进行分组,但是我仍然无法从每个组中删除项目。

List<Course> courses  = allCourses
.Where()
.OrderByDescending(x=> x.StartDate)
.GroupBy(x => x.StartDate && x.ClassName)
.FirstOrDefault()?.ToList()

1 个答案:

答案 0 :(得分:0)

由于您的原始数据在一个组中可能有多个“新”项目,因此我选择了所有“新”项目。

首先,您按StartDateClassName分组。请注意,对多个值进行分组的正确语法是创建一个匿名对象。

然后您对结果进行排序-不能认为在分组依据之前进行排序。

然后,对于每个结果组,如果课程多于一门,则选择所有状态为“新建”的课程,否则,选择一门课程。

var courses = allCourses.GroupBy(c => new { c.StartDate, c.ClassName })
                        .OrderByDescending(cg => cg.Key.StartDate)
                        .SelectMany(cg => cg.Where(c => cg.Count() == 1 || c.Status == "New").Select(c => new { c.CourseId, cg.Key.ClassName, cg.Key.StartDate, c.Status }));