使用 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 是我为MaxAverage 所需的参数指定的任意名称。与我使用的任意名称 lg 相同。【参考方案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 检索平均分的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 中的外键列检索单个记录?

无法使用 Nhibernate 的 Linq 检索 Group By 实体或复合键

使用 linq 查询和实体框架进行检索

使用 LINQ 优化内存中慢查询列表以检索数据

使用linq mvc c#从数据库中检索图像

使用 linq 从 IdentityUser 列表中检索自定义配置文件数据