我正在研究一个C#项目,该项目涉及跟踪石头剪刀游戏的前五名高分。现在我有一个数组来保持前五个分数(这是整数),我按降序排序数组,并使用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;
}
}
答案 0 :(得分:4)
这样的事情可以解决问题:
排名前五位......
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();
答案 1 :(得分:0)
我相信你的方式比创建冗余列表更正确,更有效率,只是你不必要地调用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));
注意:我的第一个解决方案是丢掉第二高分,所以我删除了它。
答案 2 :(得分:0)
您可以在不创建新列表的情况下执行此操作。
[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);