gpt4 book ai didi

c# - 使用 LINQ 获取组的平均值

转载 作者:太空狗 更新时间:2023-10-29 22:16:00 25 4
gpt4 key购买 nike

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

更好地说,我有一个学生列表:

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

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

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

但它根本没有名字。


结果现在是:

enter image description here

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


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

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

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

关于c# - 使用 LINQ 获取组的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28426740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com