最简单的方式吐出数组数在特定的方式

本文关键字:方式 数组 方式吐 最简单 | 更新日期: 2023-09-27 18:18:37

我有一个包含11个数字的数组和一个包含11个名字的数组。我也有平均值和前三名的数字。用户分别输入数字和名称,然后进入两个单独的数组。

例如我有:

playerName[0] = player1.Text;
playerName[1] = player2.Text;
playerName[2] = player3.Text;
playerName[3] = player4.Text;
playerName[4] = player5.Text;
playerName[5] = player6.Text;
playerScore[0] = int.Parse(score1.Text);
playerScore[1] = int.Parse(score2.Text);
playerScore[2] = int.Parse(score3.Text);
playerScore[3] = int.Parse(score4.Text);
playerScore[4] = int.Parse(score5.Text);
playerScore[5] = int.Parse(score6.Text);
int highestScore = playerScore.Max();
double averageScore = playerScore.Average();
int largest = int.MinValue;
int second = int.MinValue;
int third = int.MinValue;
foreach (int i in playerScore)
{              
    if (i > largest)
    {
        third = second;
        second = largest;
        largest = i;
    }
    else if (i > second && i != largest)
        second = i;
    else if (i > third && i != second)
        third = i;
}

有什么简单的方法可以列出这样的东西吗?

 textbox.Text = highest score is: " + highestScore + " by " -INSERT RELEVENT playerName HERE-

我可以想到一些方法,但很可能它会变成一大堆if和开关

谢谢

最简单的方式吐出数组数在特定的方式

创建一个类来表示Player对象,另一个类从List继承来包含玩家。然后你可以这样做:

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
    public Player(string name)
    {
        Name = name;
    }
}
public class Players : List<Player>
{
    public void SortByScore()
    {
        Sort((a, b) => a.Score.CompareTo(b.Score));
    }
    public void SortByName()
    {
        Sort((a, b) => a.Name.CompareTo(b.Name));
    }
}

不使用并行数组,而是将分数和名称分组到一个新类中,并将它们组成一个数组:

class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
}

Player players[] = new Player[11];

players[0] = new Player(){ Name = player1.Text, Score = int.Parse( score1.Text ) };

然后你可以循环遍历每个玩家并保存得分最高的玩家,而不仅仅是分数:

Player highestScore = players[0];
foreach( Player p in players )
{
    if( highestScore.Score < p.Score )
    {
         highestScore = p; 
    }
}
textBox.Text = "Highest Score is: " + highestScore.Score + " by " + highestScore.Name;

还要注意,您没有对文本框数据进行验证,因此,如果文本不是int,您的程序将抛出异常并可能崩溃。

这应该适用于您当前的设计:

int index = playerScore.ToList().IndexOf(playerScore.Max());
textbox.Text = string.Format("highest score is:{0} - by player: {1}",playerScore.Max(),playerName[index]);

但是最好的方法应该是创建提供这些信息的类,然后创建一个列表,其中每个元素都包含您需要的信息,如名称和分数。

DO:将逻辑封装到一个类中,该类的职责是跟踪Player信息:

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
}

DON'T: Inherit List<T>

封装分数排序逻辑的最简单方法是使用扩展方法:

public static class PlayerExtensions
{
    public static IEnumerable<Player> SortByScore(this IEnumerable<Player> players)
    {
        return players.OrderByDescending(p => p.Score);
    }
}

然而,我认为抽象这个LINQ代码没有什么价值。在我看来,你可以使用简单的List<Player>,当你需要分数时,只需执行players.OrderByDescending(p => p.Score);