使用 linq 检索平均分
Posted
技术标签:
【中文标题】使用 linq 检索平均分【英文标题】:Using linq to retrieve average score 【发布时间】:2015-06-20 06:06:16 【问题描述】:希望能得到一点帮助。
我正在从数据库中检索以下列表。
Name AssessNumber Score
John 1 90
John 2 88
John 3 67
Steve 1 98
Steve 2 90
我想要的是按平均分数分组并显示最高评估数(int)
Name AssessNumber Score
John 3 81.6
Steve 2 94
数据将存储在List<lbResults>lb = new List<lbResults>()
我怎样才能做到这一点?
亲切的问候
【问题讨论】:
应该可以使用直截了当的group by
。你试过什么?你被困在哪里了?
提示:***.com/a/1575413/1004522
好像group by average score
会产生很多单项组
【参考方案1】:
试试这个:
var results = data.GroupBy(x => x.Name).Select(x => new
Name = x.Key,
AssessNumber = x.Max(z => z.AssessNumber),
Score = x.Average(z => z.Score)
)
您也可以返回原始数据结构(您命名为lbResults
):
var results = data.GroupBy(x => x.Name).Select(x => new lbResults
Name = x.Key,
AssessNumber = x.Max(z => z.AssessNumber),
Score = x.Average(z => z.Score)
)
见Fiddle
【讨论】:
【参考方案2】:我想要的是按平均分分组
从输出看来,您希望按Name
分组并获得最大AssessNumber
和平均Score
。您的查询应该是:
var query = lb.GroupBy(r => r.Name)
.Select(grp => new
Name = grp.Key,
AccessNumber = grp.Max(i=> i.AccessNumber),
AverageScore = grp.Avg(i => i.Score),
);
【讨论】:
【参考方案3】:给定:
public class lbResults
public string Name get; set;
public int Assess get; set;
public int Score get; set;
你想要的:
List<lbResults> lb = new List<lbResults>
new lbResults Name="John", Assess = 1, Score=90,
new lbResults Name="John", Assess = 2, Score=88,
new lbResults Name="John", Assess = 3, Score=67,
new lbResults Name="Steve", Assess = 1, Score=98,
new lbResults Name="Steve", Assess = 2, Score=90,
;
var results = lb.GroupBy(l => l.Name)
.Select(g => new
Name = g.Key,
Assess = g.Max(gr => gr.Assess),
Score = g.Average(gr => gr.Score)
);
【讨论】:
我喜欢这个作为答案。您能否谈谈 .Max(gr => gr.Assess) 和 .Average(gr => gr.Score) 的情况。 gr 的缩写是什么?gr
是我为Max
和Average
所需的参数指定的任意名称。与我使用的任意名称 l
和 g
相同。【参考方案4】:
试试这个:-
List<lblResults> result = data.GroupBy(x => x.Name)
.Select(x => new lbResults
Name = x.Key,
AssessNumber = x.Max(z => z.AssesName),
Score = x.Average(s => s.Score)
).ToList();
【讨论】:
【参考方案5】:让玩家参与:
var players = new List<Player>
new Player Name = "John", AssessNumber = 1, Score = 90 ,
new Player Name = "John", AssessNumber = 2, Score = 88 ,
new Player Name = "John", AssessNumber = 3, Score = 67 ,
new Player Name = "Steve", AssessNumber = 1, Score = 98 ,
new Player Name = "Steve", AssessNumber = 2, Score = 90 ,
;
此代码显示了使用 linq 查询表达式语法进行分组:
var playerInfos =
from player in players
group player by player.Name into playerGroup
select new
PlayerName = playerGroup.Key,
MaxAssessNumber = playerGroup.Max(x => x.AssessNumber),
AverageScore = playerGroup.Average(x => x.Score),
;
结果playerInfos
是匿名对象的集合:
PlayerName = "John", MaxAssessNumber = 3, AverageScore = 81.66666...
PlayerName = "Steve", MaxAssessNumber = 2, AverageScore = 94.0
查看更多关于LINQ Average聚合方法的信息。
【讨论】:
以上是关于使用 linq 检索平均分的主要内容,如果未能解决你的问题,请参考以下文章