使用 LINQ 获取组的平均值

Getting average value of groups with LINQ

我试图根据列表中每个项目的特定值将我的列表分成不同的组,然后找到这些组中另一个值的平均值。

更确切地说,我有一份学生名单:

List<Student> students = new List<Student> {
    new Student { Name="Bob", Level=Level.Sophomore, GPA=3.2f },
    new Student { Name="Cathy", Level=Level.Freshman, GPA=3.6f },
    new Student { Name="James", Level=Level.Senior, GPA=3.8f },
    new Student { Name="Jessica", Level=Level.Senior, GPA=3.7f },
    new Student { Name="Derek", Level=Level.Junior, GPA=2.8f },
    new Student { Name="Sam", Level=Level.Junior, GPA=3.1f }
};

我想按 Class 级别对他们进行分组,因此他们将分为新生、大二、大三和大四。然后我希望能够获得这些组的平均 GPA。

因此这些学生的可能结果集是:

Senior: 3.7
Junior: 2.9
Sophomore: 3.2
Freshman : 3.6

虽然我不太确定如何获得这个结果。我试过 students.GroupBy(x => x.Level).Average(); 之类的东西,但它不起作用。

如有任何想法,我们将不胜感激。谢谢!

您必须使用额外的 Select,所以您正在寻找这样的东西:

var result = students.GroupBy(s => s.Level)
                     .Select(g => new {Level=g.Key, Avg=g.Average(s => s.GPA)});

Select(g => new {...}) 为每个组创建一个新的匿名类型的实例。

该类型有两个属性:

  • Level,即Key属性组
  • Avg,这是小组的平均GPA

只是"imagine"有这种类型在使用(或多或少):

class GroupAverage
{
    public Level Level { get; set; }
    public float Avg { get; set; }
}

var result = students.GroupBy(s => s.Level)
                     .Select(g => new GroupAverage { Level=g.Key, Avg=g.Average(s => s.GPA) } );

但它根本没有名字。


result 现在是:

如果需要,请随意对值进行四舍五入。


要获得最高平均值的 Level,只需使用

var highest = result.OrderByDescending(a => a.Avg).First().Level;

(请注意,如果 students 中没有项目,这将崩溃)

看看这个:

students.GroupBy(s => s.Level, s => s.GPA, 
                (level, scores) => new { Level = level, Avg = scores.Average() }