Сортировка списка и вычисление индекса - PullRequest
0 голосов
/ 18 февраля 2012

В основном я пытаюсь получить "рейтинг" между 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;

Я чувствую, что могу сделать это гораздо более эффективно и менее беспорядочно, чем этот код ... Ну, это также предполагает, что отрицательный результат не является результатом, который может получить человек. Есть ли другой способ быть более эффективным, чем этот? А что если сказать, что мы хотим иметь отрицательные оценки?

Ответы [ 3 ]

0 голосов
/ 18 февраля 2012

Попробуйте использовать словарь, подобный этому:

        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
0 голосов
/ 18 февраля 2012

Использование 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));
0 голосов
/ 18 февраля 2012

Вы можете создать словарь, в котором игрок - это ключ, а оценка - это значение:

Dictionary<Player int> playerToScore;

Теперь вы можете сортировать игроков по своему усмотрению, но когда вам нужно получить или изменить его счет, вы просто делаете:

var playerScore = playerToScore[myPlayer];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...