【问题标题】:Using linq to retrieve average score使用 linq 检索平均分
【发布时间】: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。你试过什么?你被困在哪里了?
  • 好像group by average score 会产生很多单项组

标签: c# linq


【解决方案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聚合方法的信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-03
          • 2021-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-18
          相关资源
          最近更新 更多