使用 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() }
我试图根据列表中每个项目的特定值将我的列表分成不同的组,然后找到这些组中另一个值的平均值。
更确切地说,我有一份学生名单:
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() }