2015-10-10 3 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 (MSG,«Таблица»);' находится за пределами 'foreach' цикла и, таким образом, напечатанный' msg' всегда один из последней итерации. В C# вам нужно использовать фигурные скобки для большинства многострочных операторов, таких как 'foreach', то есть: чтобы увидеть все значения, вам нужно будет написать' foreach (int x in thing) {msg = msg + x + "\ n"; MessageBox.Show (msg, «Таблица»); } '. – varocarbas

ответ

0

Изменить это:

foreach (int x in thing) 
msg = msg + x + "\n"; 
MessageBox.Show(msg, "Table"); 

To:

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 цикл для итерации gh это. В 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 позволяет конкатенировать текст более эффективно.

Смежные вопросы