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

  1. 使用循环初始化数组,而不是像您在示例中那样显式写出每个元素。
  2. 为了便于识别数组中一行的结尾,以便在输出中添加换行符。

在您的示例中,您的随机数只是一个数字。但是,如果您想要格式化位数可能不同的数字,您可能希望用 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]);