对列表进行排序并确定索引

时间:2012-02-18 04:16:02

标签: c# arrays list sorting indexing

基本上我试图在4人之间获得“排名”。我有一系列的球员得分,其中包含每个人的得分,使得人1的得分在索引0,人2的得分在索引1等等...我想获得列表中最佳得分手的索引,得到第二个,第三个,也就是最后一个。

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

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;

我觉得我能以更高效的方式做到这一点,并且不像这段代码那样凌乱...... 嗯,这也假设负面不是一个人可以获得的分数。有没有其他办法,比这更有效率?那么如果我们想要得分为负值呢?

3 个答案:

答案 0 :(得分:0)

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

Dictionary<Player int> playerToScore;

现在您可以根据需要对玩家进行排序,但是当您需要获得或更改其得分时,您只需执行以下操作:

var playerScore = playerToScore[myPlayer];

答案 1 :(得分:0)

尝试使用这样的词典:

        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

答案 2 :(得分:0)

使用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));