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