2015-10-10 65 views
2

我剛剛正在學習多維數組和消息框。我目前在我的消息框中創建2列時遇到問題。我現在可以打印出需要的隨機數字,但只能在一列中打印。謝謝您的幫助!在MessageBox中顯示多維數組的值

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"); 
+3

'MessageBox.Show(味精,「表」);'是'foreach'環外,因此印刷'msg'總是來自最後一次迭代的那個。在C#中,你必須對大多數多行語句使用大括號,比如'foreach',即:要查看所有的值,你必須編寫'foreach(int x in thing) { msg = msg + x +「\ n」; MessageBox.Show(msg,「Table」); }'。 – varocarbas

回答

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變量和for循環來遍歷throu呃。在y我們只有2個元素,所以我們可以只使用[0][1]索引,因爲我們知道這裏只有兩個元素。這說明了線:

msg += thing[i, 0] + " " + thing[i, 1] + "\n"; 

小心串聯串那樣的,因爲如果你沒有你的號碼之間的編譯器添加這個空間" "將只需添加它們,所以元素像[33, 10]將級聯,像字符串: "43 \n"而不是"33 10 \n"

P.S. 因此,讓我們用String.Format方法來確保它格式化好:

msg += String.Format("{0} {1}\n", thing[i, 0], thing[i, 1]);

0

我懷疑這個問題是現有問題的重複,但我找不到合適的先例。所以也許我們需要一個解釋如何格式化輸出的二維數組的答案。這是一個這樣的答案。 :)

首先要記住的是,您使用MessageBox顯示這一事實只是勉強相關。你是什​​麼真的問是如何格式化一個二維數組作爲一個字符串,其中該字符串包括數據中行之間的換行符,並且列在輸出中排列。一旦你有了這個字符串,你可以在任何使用固定空間字體的上下文中進行顯示(實際上而不是MessageBox&hellip;但是創建自己的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. 爲了便於識別數組中行的末尾,以便可以將分行符添加到輸出中。

在你的例子中,你的隨機數只有一個數字。但是,如果您想要格式化其數字位數可能不同的數字,則需要用空格填充較短數字的輸出,以便輸出列中的數字排列整齊。你可以通過添加一個寬度說明輸出,就像這樣:

  sb.AppendFormat("{0,2}", array[i, j]); 

在上面的,而不是使用默認格式爲前面的代碼示例做,我明確地指定格式(和調用AppendFormat()而不是Append()這樣做),並且以那種明確的格式,我已經包含文本,2,以表明我希望輸出字符串具有兩個字符的最小寬度。該方法將根據需要添加空格以確保這一點。

我也從簡單字符串連接更改爲使用StringBuilder。在你原來的例子中,字符串連接可能並不可怕,但它也不是一個好習慣。當您在循環中重複追加文本時,應始終使用StringBuilder。否則,可能會創建過多的對象,並且花費複製字符數據所花費的過多時間。使用StringBuilder可以更有效地連接文本。