最简单的方式吐出数组数在特定的方式
本文关键字:方式 数组 方式吐 最简单 | 更新日期: 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);