对列表进行排序并计算索引

本文关键字:计算 索引 排序 列表 | 更新日期: 2023-09-27 18:24:57

基本上我想在4个人之间获得"排名"。我有一个球员得分数组,其中包含每个人的得分,这样人1的得分在指数0,人2的得分在指标1,等等。我想获得列表中得分最高的人的指数,并获得第二、第三和最后一个。

我对解决方案的尝试:我从数组playerScores中列出了一个列表(我觉得这可能没有必要,但由于我要做的事情,我不想破坏原始分数),其中按顺序包含分数。然后,我在列表中找到最大值,并得到它的索引。然后我将该索引处的值更改为负值。然后我重做步骤。

List<int> listOfScores = new List<int>(playerScores.ToList());
// We get the max value to determine the top scorer of the game
// and then we insert a negative value at that same spot of the list so we can
// continue on figuring out the following max value in the list, etc.
rank1 = listOfScores.IndexOf(listOfScores.Max());
listOfScores[rank1] = -1;
rank2 = listOfScores.IndexOf(listOfScores.Max());
listOfScores[rank2] = -1;
rank3 = listOfScores.IndexOf(listOfScores.Max());
listOfScores[rank3] = -1;
rank4 = listOfScores.IndexOf(listOfScores.Max());
listOfScores[rank4] = -1;

我觉得我可以用一种更高效的方式来做这件事,而且不像这段代码那样混乱。。。好吧,这也是假设消极不是一个人可以得到的分数。还有其他方法比这更有效吗?如果说我们想要负分呢?

对列表进行排序并计算索引

使用LINQ:

using System.Linq;
var ranked = playerScores.Select((score, index) => 
                                 new {Player=index+1, Score=score})
                         .OrderByDescending(pair => pair.Score)
                         .ToList();

然后显示获胜者,例如:

Console.WriteLine(String.Format("Winner: Player {0} with score {1}", 
                  ranked[0].Player, ranked[0].Score));

您可以构建一个字典,其中玩家是关键,分数是值:

Dictionary<Player int> playerToScore;

现在你可以根据自己的意愿对玩家进行排序,但当你需要获得或更改其分数时,你只需执行以下操作:

var playerScore = playerToScore[myPlayer];

尝试使用这样的字典:

        var userScores = new Dictionary<int,int>{{1,3},{2,2},{3,1},{4,6}};
        var orderedUserScores = userScores.OrderBy(x => x.Value);
        //orderedUserScores[0] returns KeyValuePair of {3,1}
        //So, the key is the player number/position, and the value is the score