使用LINQ获取组的平均值

时间:2015-02-10 08:02:43

标签: c# linq

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

为了更好地说明,我有一份学生名单:

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 }
};

我想按照他们的班级对他们进行分组,这样他们就可以分为新生,二年级,初中和高年级。然后我希望能够获得这些组的平均GPA。

因此,为这些学生设定的结果可能是:

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

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

对此的任何想法将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:13)

你必须使用额外的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

只是“想象”使用这种类型(或多或少):

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现在是:

enter image description here

如果需要,请随意舍入值。


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

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

(请注意,如果students

中没有项目,则会崩溃

答案 1 :(得分:0)

检查出来:

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