在 MessageBox 中显示多维数组的值
Displaying the values of a multidimensional array in a MessageBox
刚开始学习多维数组和消息框。我目前在消息框中创建 2 列时遇到问题。我目前可以让它打印出我需要的随机数,但只能打印在一列中。感谢您的帮助!
string msg = "";
Random numb = new Random();
int[,] thing = new int[ 10, 2 ];
thing[0, 0] = numb.Next(0,10);
thing[0, 1] = numb.Next(0,10);
thing[1, 0] = numb.Next(0,10);
thing[1, 1] = numb.Next(0,10);
thing[2, 0] = numb.Next(0,10);
thing[2, 1] = numb.Next(0,10);
thing[3, 0] = numb.Next(0,10);
thing[3, 1] = numb.Next(0,10);
thing[4, 0] = numb.Next(0,10);
thing[4, 1] = numb.Next(0,10);
thing[5, 0] = numb.Next(0,10);
thing[5, 1] = numb.Next(0,10);
thing[6, 0] = numb.Next(0,10);
thing[6, 1] = numb.Next(0,10);
thing[7, 0] = numb.Next(0,10);
thing[7, 1] = numb.Next(0,10);
thing[8, 0] = numb.Next(0,10);
thing[8, 1] = numb.Next(0,10);
thing[9, 0] = numb.Next(0,10);
thing[9, 1] = numb.Next(0,10);
foreach (int x in thing)
msg = msg + x + "\n";
MessageBox.Show(msg, "Table");
我怀疑这个问题与现有问题重复,但我找不到合适的先例。所以也许我们需要一个答案来解释如何格式化二维数组以进行输出。这是这样的回答。 :)
首先要记住的是,您使用 MessageBox
显示这个事实几乎没有关系。您真正问的是如何将二维数组格式化为字符串,其中该字符串包括数据行之间的换行符,并且列在输出中排列.一旦你有了那个字符串,你就可以在任何使用固定space字体的上下文中显示(实际上是不是 MessageBox
…但这并不难创建您自己的 Form
用作消息框,您可以在其中指定用于显示文本的字体)并按照您的要求显示输出。
例如,这里有一个控制台程序可以执行您想要的操作:
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
Random random = new Random();
int[,] array = new int[10, 2];
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
array[i, j] = random.Next(10);
if (j > 0)
{
sb.Append(", ");
}
sb.Append(array[i, j]);
}
sb.AppendLine();
}
Console.WriteLine(sb);
}
请注意,我已将数组的初始化和值的格式合并到一段代码中。我还使用嵌套 for
循环来索引数组中的每个单独元素;这允许两件事:
- 使用循环初始化数组,而不是像您在示例中那样显式写出每个元素。
- 为了便于识别数组中一行的结尾,以便在输出中添加换行符。
在您的示例中,您的随机数只是一个数字。但是,如果您想要格式化位数可能不同的数字,您可能希望用 spaces 填充输出以获得较短的数字,以便输出列中的数字对齐。您可以通过向输出添加宽度说明符来实现,如下所示:
sb.AppendFormat("{0,2}", array[i, j]);
在上面,我没有像前面的代码示例那样使用默认格式,而是明确指定了一种格式(并调用 AppendFormat()
而不是 Append()
来这样做),并且在在这种显式格式中,我包含了文本 ,2
,以表明我希望输出字符串的最小宽度为两个字符。该方法将根据需要添加 spaces 以确保。
我也从简单的字符串连接改成了使用StringBuilder
。在您的原始示例中,字符串连接可能并不可怕,但这也不是一个好习惯。当您在循环中重复追加文本时,您应该始终使用 StringBuilder
。否则,可能会创建过多的对象,并且可能会花费过多的时间来复制角色数据。使用 StringBuilder
可以更有效地连接文本。
改变这个:
foreach (int x in thing)
msg = msg + x + "\n";
MessageBox.Show(msg, "Table");
收件人:
for (int i = 0; i < thing.GetLength(0); i++)
msg += String.Format("{0} {1}\n", thing[i, 0], thing[i, 1]);
//msg += thing[i, 0] + " " + thing[i, 1] + "\n";
MessageBox.Show(msg, "Table");
解释:
方法 GetLength(0)
returns 我们 x
的维度长度(它基本上类似于简单数组的 array.Length
但具有特定维度)并且我们使用 i
变量和 for
循环遍历它。在 y
中我们只有 2 个元素,所以我们可以只使用 [0]
和 [1]
索引,因为我们知道那里只有两个元素。这解释了这一行:
msg += thing[i, 0] + " " + thing[i, 1] + "\n";
像这样连接字符串时要小心,就好像你不在你的数字之间添加这个 space " "
编译器只会添加它们,所以像 [33, 10]
这样的元素将是连接到字符串,例如:"43 \n"
而不是 "33 10 \n"
.
P.S。
所以让我们使用 String.Format
方法来确保它的格式正确:
msg += String.Format("{0} {1}\n", thing[i, 0], thing[i, 1]);
刚开始学习多维数组和消息框。我目前在消息框中创建 2 列时遇到问题。我目前可以让它打印出我需要的随机数,但只能打印在一列中。感谢您的帮助!
string msg = "";
Random numb = new Random();
int[,] thing = new int[ 10, 2 ];
thing[0, 0] = numb.Next(0,10);
thing[0, 1] = numb.Next(0,10);
thing[1, 0] = numb.Next(0,10);
thing[1, 1] = numb.Next(0,10);
thing[2, 0] = numb.Next(0,10);
thing[2, 1] = numb.Next(0,10);
thing[3, 0] = numb.Next(0,10);
thing[3, 1] = numb.Next(0,10);
thing[4, 0] = numb.Next(0,10);
thing[4, 1] = numb.Next(0,10);
thing[5, 0] = numb.Next(0,10);
thing[5, 1] = numb.Next(0,10);
thing[6, 0] = numb.Next(0,10);
thing[6, 1] = numb.Next(0,10);
thing[7, 0] = numb.Next(0,10);
thing[7, 1] = numb.Next(0,10);
thing[8, 0] = numb.Next(0,10);
thing[8, 1] = numb.Next(0,10);
thing[9, 0] = numb.Next(0,10);
thing[9, 1] = numb.Next(0,10);
foreach (int x in thing)
msg = msg + x + "\n";
MessageBox.Show(msg, "Table");
我怀疑这个问题与现有问题重复,但我找不到合适的先例。所以也许我们需要一个答案来解释如何格式化二维数组以进行输出。这是这样的回答。 :)
首先要记住的是,您使用 MessageBox
显示这个事实几乎没有关系。您真正问的是如何将二维数组格式化为字符串,其中该字符串包括数据行之间的换行符,并且列在输出中排列.一旦你有了那个字符串,你就可以在任何使用固定space字体的上下文中显示(实际上是不是 MessageBox
…但这并不难创建您自己的 Form
用作消息框,您可以在其中指定用于显示文本的字体)并按照您的要求显示输出。
例如,这里有一个控制台程序可以执行您想要的操作:
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
Random random = new Random();
int[,] array = new int[10, 2];
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
array[i, j] = random.Next(10);
if (j > 0)
{
sb.Append(", ");
}
sb.Append(array[i, j]);
}
sb.AppendLine();
}
Console.WriteLine(sb);
}
请注意,我已将数组的初始化和值的格式合并到一段代码中。我还使用嵌套 for
循环来索引数组中的每个单独元素;这允许两件事:
- 使用循环初始化数组,而不是像您在示例中那样显式写出每个元素。
- 为了便于识别数组中一行的结尾,以便在输出中添加换行符。
在您的示例中,您的随机数只是一个数字。但是,如果您想要格式化位数可能不同的数字,您可能希望用 spaces 填充输出以获得较短的数字,以便输出列中的数字对齐。您可以通过向输出添加宽度说明符来实现,如下所示:
sb.AppendFormat("{0,2}", array[i, j]);
在上面,我没有像前面的代码示例那样使用默认格式,而是明确指定了一种格式(并调用 AppendFormat()
而不是 Append()
来这样做),并且在在这种显式格式中,我包含了文本 ,2
,以表明我希望输出字符串的最小宽度为两个字符。该方法将根据需要添加 spaces 以确保。
我也从简单的字符串连接改成了使用StringBuilder
。在您的原始示例中,字符串连接可能并不可怕,但这也不是一个好习惯。当您在循环中重复追加文本时,您应该始终使用 StringBuilder
。否则,可能会创建过多的对象,并且可能会花费过多的时间来复制角色数据。使用 StringBuilder
可以更有效地连接文本。
改变这个:
foreach (int x in thing)
msg = msg + x + "\n";
MessageBox.Show(msg, "Table");
收件人:
for (int i = 0; i < thing.GetLength(0); i++)
msg += String.Format("{0} {1}\n", thing[i, 0], thing[i, 1]);
//msg += thing[i, 0] + " " + thing[i, 1] + "\n";
MessageBox.Show(msg, "Table");
解释:
方法 GetLength(0)
returns 我们 x
的维度长度(它基本上类似于简单数组的 array.Length
但具有特定维度)并且我们使用 i
变量和 for
循环遍历它。在 y
中我们只有 2 个元素,所以我们可以只使用 [0]
和 [1]
索引,因为我们知道那里只有两个元素。这解释了这一行:
msg += thing[i, 0] + " " + thing[i, 1] + "\n";
像这样连接字符串时要小心,就好像你不在你的数字之间添加这个 space " "
编译器只会添加它们,所以像 [33, 10]
这样的元素将是连接到字符串,例如:"43 \n"
而不是 "33 10 \n"
.
P.S。
所以让我们使用 String.Format
方法来确保它的格式正确:
msg += String.Format("{0} {1}\n", thing[i, 0], thing[i, 1]);