2014-01-22 8 views
1

У меня есть матрица, которая считывается с консоли. Элементы разделены пробелами и новыми строками. Как преобразовать его в многомерный массив int в C#? Я пробовал:Преобразование строки в многомерный массив

String[][] matrix = (Console.ReadLine()).Split('\n').Select(t => t.Split(' ')).ToArray(); 

но когда я нажимаю кнопку ввода, программа заканчивается, и это не позволяет мне вводить больше строк.

Примером является:

1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7 
4 5 6 7 8 
5 6 7 8 9 
+0

Какой язык это (добавить в теги)? Также вы читаете только одну строку. – Njol

+1

Возможно, я слишком долго отсутствовал из консольных приложений, но как бы вы приняли '\ n' в' Console.ReadLine'? Разве чтение не прекращено на '\ n'? –

+0

@BradChristie - путем принятия нескольких 'Console.ReadLine()' 's в цикле – Jamiec

ответ

0

Первые вещи сначала, Console.ReadLine() считывает одну строку из ввода. Поэтому, чтобы принять несколько строк, вам нужно сделать 2 вещи:

  1. Имейте петлю, которая позволяет пользователю продолжать вводить строки данных. Вы можете отпустить их до тех пор, пока они не оставят строку пустой, или вы можете исправить ее до 5 строк ввода.
  2. Сохраните эти «строки» данных для дальнейшей обработки.

Предположим, что пользователь может ввести любое количество строк и пустую строку (просто ударяя ввод) указывает на окончание ввода данных что-то вроде этого будет достаточно

List<string> inputs = new List<string>(); 
var endInput = false; 
while(!endInput) 
{ 
    var currentInput = Console.ReadLine(); 
    if(String.IsNullOrWhitespace(currentInput)) 
    { 
     endInput = true; 
    } 
    else 
    { 
     inputs.Add(currentInput); 
    } 
} 

// when code continues here you have all the user's input in separate entries in "inputs" 

Теперь для поворота, что в массив массивов:

var result = inputs.Select(i => i.Split(' ').ToArray()).ToArray(); 

это даст вам массив массивов строк (что ваш пример был). Если вы хотите, чтобы они были целыми числами можно разобрать их, как вы идете:

var result = inputs.Select(i => i.Split(' ').Select(v => int.Parse(v)).ToArray()).ToArray(); 
0
// incoming single-string matrix: 
String input = @"1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7 
4 5 6 7 8 
5 6 7 8 9"; 

// processing: 
String[][] result = input 
    // Divide in to rows by \n or \r (but remove empty entries) 
    .Split(new[]{ '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries) 
    // no divide each row into columns based on spaces 
    .Select(x => x.Split(new[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries)) 
    // case from IEnumerable<String[]> to String[][] 
    .ToArray(); 

результат:

String[][] result = new string[]{ 
    new string[]{ "1","2","3","4","5" }, 
    new string[]{ "2","3","4","5","6" }, 
    new string[]{ "3","4","5","6","7" }, 
    new string[]{ "4","5","6","7","8" }, 
    new string[]{ "5","6","7","8","9" } 
}; 
0

Это может быть сделано несколькими способами

Вы можете прочитать один строка, содержащая множественные числа, разделенные символом, разделенные этим char, получающим массив из int, и затем вы должны получить матрицу.

С готовым linq нет никакого тривиального способа для этапа выборки, и я думаю, что на самом деле не стоит использовать сторонние библиотеки из кода, например LinqLib или что-то в этом роде.

0
int[,] Matrix = new int[n_rows,n_columns]; 


    for(int i=0;i<n_rows;i++){ 
     String input=Console.ReadLine(); 
     String[] inputs=input.Split(' '); 
     for(int j=0;j<n_columns;j++){ 
      Matrix[i,j]=Convert.ToInt32(inputs[j]); 
     } 
    } 

вы можете попробовать это, чтобы загрузить матрицу

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