2015-02-10 69 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