2012-02-18 2 views
0

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

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

+0

Почему вы не можете просто использовать listOfScores.Sort(); ? http://msdn.microsoft.com/en-us/library/b0zbh7b6.aspx – ccKep

+1

listOfScores.Sort() сортирует результаты по порядку, но не отслеживает их предыдущие индексы. – skyjlv

ответ

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)); 
0

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

Dictionary<Player int> playerToScore;

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

var playerScore = playerToScore[myPlayer]; 
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 
Смежные вопросы