Преобразование массива строк в многомерный двойной - PullRequest
0 голосов
/ 30 марта 2019

Мне нужно прочитать матрицу из файла, чтобы удвоить [,]. До сих пор можно прочитать файл как строку []. Структура данных выглядит так: enter image description here

Но преобразование не работает.

Я уже перепробовал много статей о стековом потоке, но он всегда терпел неудачу с «Входная строка была в неправильном формате». Важно то, что все значения являются двойными значениями и разделены тремя пробелами.

Я прочитал файл так:

var text = File.ReadAllLines(@"right.txt");

1 Ответ

1 голос
/ 30 марта 2019

Вы можете сделать это несколькими способами, и это зависит от того, хотите ли вы использовать зубчатый массив или многомерный массив.

Вероятно, есть более краткие способы сделать это, однако, вы можете увидеть идею.

Jagged

var jaggedArray = File.ReadAllLines(@"d:\right.txt")
                        .Where(x => !string.IsNullOrWhiteSpace(x))
                        .Select(x => x.Split(new[]{' '},StringSplitOptions.RemoveEmptyEntries)
                                     .Select(double.Parse)
                                     .ToArray())
                        .ToArray();

Многомерный

var lines = File.ReadAllLines(@"d:\right.txt")
                  .Where(x => !string.IsNullOrWhiteSpace(x))
                  .Select(x => x.Split(new[]{' '},StringSplitOptions.RemoveEmptyEntries)
                               .Select(double.Parse)
                               .ToList())
                  .ToList();

var h = lines.Count();
var w = lines.Max(x => x.Count);
var multiArray = new double[h, w];

for (var i = 0; i < lines.Count; i++)
   for (var j = 0; j < lines[i].Count; j++)
      multiArray[i, j] = lines[i][j];

Примечание : Полностью не проверено, и я не несу ответственности за нанесение увечий или нанесение другого вреда этим кодом
Примечание 2 : нет проверки ошибок или отказоустойчивости, если в вашем файле есть мусор, это, скорее всего, приведет к

Обновление

Есть ли способ отладить / исправить это? Может быть, проблема в том, что двойной значения разделены 3 пробелами, а не только 1 пробел? Есть ли способ исправить это в операторе LINQ?

Да, если есть несколько пробелов, использование StringSplitOptions.RemoveEmptyEntries должно работать

Split(new [] {' '},StringSplitOptions.RemoveEmptyEntries)

Однако обратите внимание, это действительно предполагает, что каждое отдельное значение может быть преобразовано в double, и нет пустых строк (даже в конце файла)

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

File.ReadAllLines(@"right.txt")
    .Where(x => !string.IsNullOrWhiteSpace(x))
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...