我试图根据列表中每个项目具有的某个值将列表分为不同的组,然后找到这些组中另一个值的平均值。
更好地说,我有一个学生名单:
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();
但是它不起作用。
任何对此的想法将不胜感激。谢谢!
您必须使用额外的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
就是现在:
如果需要,可以随意舍入这些值。
要获得Level
最高的平均值,只需使用
var highest = result.OrderByDescending(a => a.Avg).First().Level;
(请注意,如果其中没有任何内容,这将导致崩溃students
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句