2015-02-10 115 views
0

我有一群学生,我想按他们的班级将他们分组,如新生,大二,初中,高中。然后我想要通过GPA订购它们。在LINQ中的GroupBy中使用OrderBy

所以,如果我只是想获得最好的GPA的学生,我的潜在结果集将是这样的:

Freshman - Name: James GPA : 3.9 
Sophomore - Name: Jessie GPA : 4.0 
Junior - Name: Caitlyn GPA: 3.9 
Senior - Name: Joshua GPA: 3.95 

我已经试过这样的事情:

var result = students.GroupBy(x => x.Level).OrderByDescending(x => x.GPA).Take(count).ToList(); 

但它总是打破,我不知道如何解决它。我试着在它们之间放置一个Select,并在Select中移动OrderBy,但是我也无法使它工作。

+0

*但它总是打破,我不知道如何解决它。*打破如何?如果你使用的是NHibernate,那么它的LINQ提供者不是很好。 – 2015-02-10 11:14:07

+2

最有可能它不编译,因为组上没有GPA属性 – 2015-02-10 11:14:42

+0

我不太确定它为什么会打破,说实话。我会以一种不会抛出错误的方式,但是当我运行它时,程序崩溃。我只是使用常规的Linq using语句使用Visual Studio。 – user3113376 2015-02-10 11:16:24

回答

1

如果你想获得谁拥有从每个组中最大的GPA的学生,你可以使用:

students.GroupBy(x => x.Level) 
     .Select(g => g.First(x => x.GPA == g.Max(y => y.GPA))) 
     .Take(count).ToList(); 

您也可以使用第三方库的方法MaxBy这样做更有效地

students.GroupBy(x => x.Level) 
      .Select(g => g.MaxBy(x => x.GPA)) 
      .Take(count).ToList(); 
+0

这不会给我我要找的结果。它返回三位大二学生和一位GPA最低的高级教师。 – user3113376 2015-02-10 11:17:43

+0

你的意思是你想让每个组的GPA最高的学生?很难理解,从你的问题 – 2015-02-10 11:20:05

+0

是的,这是我正在尝试做的。如果我的问题有点偏离,我很抱歉。我不太清楚如何去问这个问题,而不是过于复杂。 – user3113376 2015-02-10 11:21:03