基本上我试图在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;
我觉得我能以更高效的方式做到这一点,并且不像这段代码那样凌乱...... 嗯,这也假设负面不是一个人可以获得的分数。有没有其他办法,比这更有效率?那么如果我们想要得分为负值呢?
答案 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));