使用临时变量为分数排序多维数组

时间:2016-04-23 15:10:39

标签: c# .net algorithm sorting multidimensional-array

大家好,在我正在制作的游戏的排行榜形式中排序包含不同用户得分的多维数组时遇到了一些麻烦。我试图使用临时变量按降序对每个用户的分数进行排序,然后输出,但没有成功。任何帮助将非常感谢谢谢。我应该补充一点,我最近才开始编码,并且必须将这个项目作为我上学工作的一部分,所以我知道它可能效率不高,看起来非常新手。

这是我的分类方法 ([i,2]是存储为字符串的分数值)

private void sortScore(string[,] sort)
{
    bool didSwap;
    do
    {
        didSwap = false;
        for (int i = 0; i < userNumber; i++)
        {
            if (i < (userNumber-1))
            {
                if (Convert.ToInt32(sort[i, 2]) > Convert.ToInt32(sort[i + 1, 2]))
                {
                    string temp = sort[i + 1, 2];
                    sort[i + 1, 2] = sort[i, 2];
                    sort[i, 2] = temp;
                }
            }            
        }
    } while (didSwap);
    for (int j = 0; j < userNumber; j++)
    {
        rtbScoreboard.AppendText("Name: " + sort[j, 0] + "\t" + "Score: " + sort[j, 2] + Environment.NewLine);
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用LINQ!

var sortedScores = Enumerable.Range(0, sort.GetLength(0)) //number of items
.Select(x => new
{
    Name = sort[x, 0],
    Score = Convert.ToInt32(sort[x, 2])
}) //converting to a meaningful structure
.OrderByDescending(x => x.Score) //sort in descending order by score
.ToList();

//building output, I don't know what is userNumber, It is a global variable 
// that might store number of players to show in score board.
for (int j = 0; j < userNumber; j++)
{
    rtbScoreboard.AppendText("Name: " + sortedScores[j].Name + "\t" + "Score: " + sortedScores[j].Score + Environment.NewLine);
} 

您不应该存储这样的数据。使用多维数组来存储名称和分数不是一个好主意。尝试定义类似Player的类,其中包含用于存储NameScore等数据的属性。然后将Player s的实例存储在列表中。

答案 1 :(得分:0)

您未能将didSwap设置为true

bool didSwap;
do
{
    didSwap = false;
    for (int i = 0; i < userNumber-1; i++)
    {
        if (Convert.ToInt32(sort[i, 2]) > Convert.ToInt32(sort[i + 1, 2]))
        {
            string temp = sort[i + 1, 2];
            sort[i + 1, 2] = sort[i, 2];
            sort[i, 2] = temp;
            didSwap = true;
        }           
    }
}   while (didSwap);