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

mar*_*k_h 2 c# linq lambda

我有以下收集的分数;

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" }
    };
Run Code Online (Sandbox Code Playgroud)

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

{ score = 10, player = "Dave" }
{ score = 8, player = "Paul" }
{ score = 8, player = "Steve" }
Run Code Online (Sandbox Code Playgroud)

这不起作用;

var top3 = scores.OrderByDescending(s => s.score).Take(3);
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

fub*_*ubo 6

如果玩家姓名只应出现一次,您必须按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);
Run Code Online (Sandbox Code Playgroud)