在MessageBox中显示多维数组的值

时间:2015-10-10 17:26:26

标签: c# arrays multidimensional-array 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");

2 个答案:

答案 0 :(得分:0)

我怀疑这个问题与现有问题重复,但我找不到合适的先例。所以,也许我们需要一个解释如何格式化二维数组输出的答案。这是一个答案。 :)

首先要记住的是,使用MessageBox显示此内容的事实几乎不相关。您真正询问的是如何将二维数组格式化为字符串,其中该字符串包含数据中行之间的换行符,并且列在输出中排成一行。拥有该字符串后,您可以在任何使用固定空间字体的上下文中显示(实际上不是 MessageBox ...但是创建自己的{{1}并不困难用作消息框,您可以在其中指定用于显示文本的字体)并使输出显示为您似乎要求的内容。

例如,这是一个可以执行您想要的控制台程序:

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); } 循环来索引数组中的每个元素;这允许两件事:

  1. 使用循环初始化数组,而不是像在示例中那样显式地写出每个元素。
  2. 为了便于识别数组中行的结尾,以便可以在输出中添加换行符。
  3. 在您的示例中,您的随机数只是一个数字。但是,如果您想要格式化数字位数可能不同的数字,您可能希望使用空格填充输出较短的数字,以便输出列中的数字排成一行。您可以通过向输出添加宽度说明符来实现,如下所示:

    for

    在上面,我没有像前面的代码示例那样使用默认格式,而是明确指定一种格式(并调用 sb.AppendFormat("{0,2}", array[i, j]); 而不是AppendFormat()来执行此操作),并在格式,我已经包含文本Append(),以表明我希望输出字符串的最小宽度为两个字符。该方法将根据需要添加空格以确保。

    我也从简单的字符串连接改为使用,2。在你的原始例子中,字符串连接可能并不可怕,但它也不是一个好习惯。当您在循环中重复附加文本时,应始终使用StringBuilder。否则,可能会产生过多的对象,并且可能花费过多的时间来复制字符数据。使用StringBuilder可以更有效地连接文本。

答案 1 :(得分:0)

改变这个:

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)返回x的维度长度(对于简单数组,它基本上类似array.Length但具有特定维度),我们使用i变量和{{1循环迭代它。在for中,我们只有2个元素,因此我们只能使用y[0]索引,因为我们知道只有两个元素。这解释了这一行:

[1]

小心连接这样的字符串,好像你没有在你的数字之间添加这个空间msg += thing[i, 0] + " " + thing[i, 1] + "\n"; 编译器只会添加它们,所以像" "这样的元素将连接成字符串,如:{ {1}}代替[33, 10]

P.S。 因此,让我们使用"43 \n"方法确保其格式正确:

"33 10 \n"