Я работаю над проектом на С#, который включает в себя отслеживание пятерки лучших результатов для игры с ножницами из каменной бумаги. Прямо сейчас у меня есть массив, который удерживает верхние пять баллов (которые являются целыми числами), я сортирую массив в порядке убывания, и я использую цикл for, чтобы сравнить счет, который только что заработал пользователь, и баллы, находящиеся в настоящее время в массиве. Если новый балл выше, чем один в массиве, сейчас новый счет просто занимает пространство в массиве, которое занял нижний.
Например, если баллы были 9, 8, 5, 3, 1, а пользователь набрал 6, баллы выглядели бы так: 9, 8, 6, 3, 1. Я задавался вопросом, есть ли способ для меня сдвиньте нижние оценки и вставьте новый, чтобы список выглядел так: 9, 8, 6, 5, 3.
Это код, который я сейчас имею, где successPercent - это оценка, рассчитанная как выигрыши, разделенные на потери и связи:
int[] scoreArray = { 84, 25, 36, 40, 50 };
Array.Sort(scoreArray);
Array.Reverse(scoreArray);
for (int x = 0; x <= scoreArray.Length; ++x)
{
if (successPercent > scoreArray[x])
{
scoreArray[x] = Convert.ToInt32(successPercent);
break;
}
}
Вы можете сделать это, не создавая новый список.
[Algo]: замените наименьшее число на новый номер, а затем отсортируйте!
int[] scoreArray = { 5, 3, 9, 8, 1 };
int new_number = 6;
//Replaces smallest number by your new number
int min_index = Array.IndexOf(scoreArray, scoreArray.Min());
scoreArray[min_index] = new_number;
Array.Sort(scoreArray);
Array.Reverse(scoreArray);
Что-то вроде этого может сделать трюк:
Возьмите 5 лучших...
int[] scoreArray = { 84, 25, 36, 40, 50 };
var tempList = new List<int>(scoreArray );
int newScore = ...;//Get the new score
tempList.Add(newScore);
scoreArray = tempList.OrderByDescending(x=>x)
.Take(5)
.ToArray();
Я считаю, что ваш путь правильный и более эффективный, чем создание избыточных списков, просто вы вызываете ненужный метод Reverse
вызова. Вместо этого оставьте свои элементы отсортированными в порядке возрастания, затем пройдите по массиву и отсортируйте его в порядке убывания.
int[] scoreArray = { 84, 25, 36, 40, 50 };
int userScore = 100;
Array.Sort(scoreArray);
for (int x = 0; x <= scoreArray.Length; ++x)
{
if (userScore > scoreArray[x])
{
scoreArray[x] = Convert.ToInt32(userScore);
break;
}
}
Array.Sort(scoreArray,(x,y) => y.CompareTo(x));
Примечание. Мое первое решение выбрало второй самый высокий балл, поэтому я удалил его.