【问题标题】:Using an OrderBy after GroupBy in LINQ在 LINQ 中的 GroupBy 之后使用 OrderBy
【发布时间】:2015-02-10 11:09:56
【问题描述】:

我有一群学生,我想按班级级别对他们进行分组,例如大一、大二、大三、大四。然后我想按 GPA 订购它们。

因此,如果我只是想让学生获得最好的 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 并将 OrderBy 移动到 Select 中,但我也无法让它工作。

【问题讨论】:

  • 但它总是坏掉,我不知道如何修复它。坏掉怎么办?如果您使用的是 NHibernate ...它的 LINQ 提供程序不是很好。
  • 很可能无法编译,因为组中没有 GPA 属性
  • 老实说,我不太确定它为什么会损坏。我将以一种不会引发错误的方式拥有它,但是当我运行它时程序会崩溃。我只是将 Visual Studio 与常规 Linq using 语句一起使用。
  • 然后我想按 GPA 排序 你想在每个组中排序学生吗?或者按最高/最低/平均 GPA 对组进行排序?

标签: c# asp.net .net linq


【解决方案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();

【讨论】:

  • 这并没有给我想要的结果。它返回 GPA 最低的三个大二学生和一个大四学生。
  • 你的意思是你想从每个小组中选出 GPA 最高的学生?从你的问题很难理解
  • 是的,这就是我想要做的。如果我的问题有点不对劲,我很抱歉。我不太确定如何在不过于复杂的情况下问它。
  • 完美运行!非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2011-05-29
  • 1970-01-01
相关资源
最近更新 更多