2015-04-14 40 views
3

希望得到一些帮助。使用linq检索平均分

我从数据库中检索以下列表。

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>()

我怎样才能做到这一点?

亲切的问候

+1

应该可以用直接的'group by'做到。你有什么尝试?你卡在哪里? – Heinzi

+0

提示:http://stackoverflow.com/a/1575413/1004522 –

+1

看起来像'平均得分组'会产生很多单项组 – Plutonix

回答

7

试试这个:

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

试试这个: -

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(); 
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), 
        }); 
2

考虑:

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

我喜欢这个答案。你能否谈谈.Max(gr => gr.Assess)和.Average(gr => gr.Score)的情况。什么是简称? – JARRRRG

+0

'gr'是我给予'Max'和'Average'所需参数的任意名称。与我使用的任意名称'l'和'g'相同。 – Jonesopolis

0

让有球员:

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查询分组表达s yntax

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集结方法。