繁体   English   中英

如何使用linq和lambdas从一个系列中获得前三名球员和他们的高分

[英]How can I get the top three players and their high scores from a collection using linq and lambdas

我有以下收集的分数;

var scores = new[]
    {
      new { score = 10, player = "Dave" }, 
      new { score = 9, player = "Dave" }, 
      new { score = 8, player = "Steve" }, 
      new { score = 7, player = "Pete" }, 
      new { score = 8, player = "Paul" }, 
      new { score = 4, player = "Mike" }
    };

我想要一个包含前三名球员及其高分的分数(按分数排序,最高分排名第一)即

{ score = 10, player = "Dave" }
{ score = 8, player = "Paul" }
{ score = 8, player = "Steve" }

这不起作用;

var top3 = scores.OrderByDescending(s => s.score).Take(3);

这是因为Dave有三个得分中的两个并且会出现两次。

保罗和史蒂夫有相同的分数,出于这个问题的目的,我并不关心哪个出现在列表中的第一位,但是对于任何解决方案都有一个奖励向上投票,这个解决方案使得名字首先出现在字母表中的人最高他们的分数是并列的(以我的示例结果中显示的确切顺序返回结果)。

答案应该使用linq和lambda表达式

谢谢

如果玩家姓名只应出现一次,您必须按player对该集合进行分组,并按score每个组进行排序。 然后你可以选择最高的3。

var top3 = scores.GroupBy(x => x.player)
                 .Select(x => x.OrderByDescending(y => y.score).First())
                 .OrderByDescending(x => x.score)
                 .ThenBy(x => x.player)
                 .Take(3);

您可以对它们进行分组,然后选择每个玩家的最高分,然后对它们进行排序:

var top3 = scores.GroupBy(x=>x.player)
                 .Select(g=>new 
                         {
                           player=g.Key,
                           score=g.Max(p=>p.score)
                        })
                 .OrderByDescending(s => s.score)
                 .ThenBy(p=>p.player).Take(3);
scores.GroupBy(i => i.player)
      .Select(g => g.OrderByDescending(s => s.score).First())
      .OrderByDescending(i => i.score)
      .ThenBy(i => i.player)
      .Take(3)

但是对于任何解决方案都有一个额外的投票,即如果他们的分数被绑定,那么名字首先出现在字母表中的人最高

然后用于订购时打破平局。

想法是按玩家分组以获得每个玩家的最佳分数,然后处理该平面列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM