用于排序高分的数组

时间:2014-05-19 14:46:45

标签: c# arrays sorting

我正在研究一个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;
    }
}

3 个答案:

答案 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);