我试图根据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();
之类的东西,但它不起作用。
对此的任何想法将不胜感激。谢谢!
答案 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
现在是:
如果需要,请随意舍入值。
要获得平均值最高的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() }