排序列表并在订购后选择所需的项目

时间:2019-04-18 16:57:00

标签: c# linq

我有一个Course类型的列表,大约有100行。课程分为三列:代码,说明和年份。因此,当前列表如下所示:

Code    Description   Year
A200    DataB         2018
A200    DataB         2019
A300    DataC         2018
A400    DataD         2019
A500    DataA         2018
A500    DataA         2019

我希望能够返回每年的最新行,然后按字母顺序对结果进行排序。所以最终结果应该是

A500    DataA    2019 (Latest A500 row and ordered by Description)
A200    DataB    2019 (Latest A200 row)
A300    DataC    2018
A400    DataD    2019

我尝试了以下变化:

List<Course> NewAllCourses = AllCourses
    .GroupBy(x => x.CourseCode)
    .Select(g => g.Last().CourseYear)
    .OrderBy(y => y.CourseDescription)
    .ToList();

但是我似乎无法正确理解语法,并且尝试使用的每个版本都出现不同的错误。由于我不完全了解自己的工作方式,因此我已经尝试了几个小时,希望能对您有所帮助。

2 个答案:

答案 0 :(得分:2)

您的代码几乎就在那里,唯一的问题是您的Select()调用仅选择了CourseYear值,您希望在其中选择整个对象,以便您可以继续对其进行处理。

类似这样的方法应该起作用:

List<Course> NewAllCourses = AllCourses
    .GroupBy(x => x.CourseCode)
//Select the last item from the group, ordered by year. 
    .Select(g => g.OrderBy(x => x.CourseYear).Last())
    .OrderBy(y => y.CourseDescription)
    .ToList();

答案 1 :(得分:0)

尝试以下操作:

List<Course> NewAllCourses = AllCourses
    .OrderByDescending(y => y.CourseYear)
    .ThenOrderBy(y => y.CourseDescription)
    .GroupBy(x => x.CourseCode)
    .Select(g => g.First())
    .ToList();