Индекс Array2D вне предела при чтении TXT-файла - PullRequest
0 голосов
/ 09 сентября 2018

Я новичок в программировании на C #, и я пытаюсь читать файлы из txt, однако каждый раз, когда выполняется этот фрагмент кода, я получаю индекс вне предела, даже несмотря на то, что я сделал отладку, я не вижу, чтобы найти решение для этого случая.

Я уверен, что это легко, но я новичок в C #, спасибо за просмотр кода.

  static void importFiles(string[,] matrix)
            {
                var path = @"export/file.txt";
        int start = getInsertIndex(matrix);


  if (File.Exists(path))
        {
            string[] fileLines = File.ReadAllLines(path);

            if (fileLines.Length == matrix.GetLength(0))
                {
                string[,] map = new string[fileLines.Length, matrix.GetLength(1)];

                for (int i = 0; i < fileLines.Length; i++)
                {
                    string line = fileLines[i];
                    for (int j = 0; j < matrix.GetLength(1); j++)
                    {
                        string[] split = line.Split(';');
                        matrix[start, j] = split[j]?.Trim();
                    }
                    start++;


                }

            } }

 static int getInsertIndex(string[,] matrix)
        {
            for (int j = 0; j < matrix.GetLength(0); j++)
            {
                if (string.IsNullOrEmpty(matrix[j, 0])) return j;
            }

            return -1;
        }

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

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

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

static void Main(string[] args)
        {
            Dictionary<int, string[]> filesData = new Dictionary<int, string[]>();
            importFiles(filesData);


        }

        static void importFiles(Dictionary<int, string[]> filesData)
        {
            var path = @"export/file.txt";


            if (File.Exists(path))
            {
                string[] fileLines = File.ReadAllLines(path);

                for (int i = 0; i < fileLines.Length; i++)
                {
                    string line = fileLines[i];
                    string[] split = line.Split(';');

                    for (int j = 0; j < split.Length; j++)
                    {
                        split[j] = split[j].Trim();
                    }
                    int index = filesData.Count == 0 ? 0: filesData.Keys.Max(); 
                    filesData.Add(index + 1, split);

                }
            }
        }
0 голосов
/ 09 сентября 2018

Вы можете обработать ситуацию в своем коде, если количество строк в матрице отличается от количества прочитанных строк (например, сгенерировать исключение):

static void importFiles(string[,] matrix)
{
    var path = @"export/file.txt";
    if (!File.Exists(path)) return;

    string[] fileLines = File.ReadAllLines(path);

    if(fileLines.Length != matrix.GetLength(0))
        // here you have couple of opitions
        // throw new ArgumentException("Number of rows in passed matrix is different from number of lines in a file!");
        // or just do nothing:
        return;

    string[,] map = new string[fileLines.Length, fileLines[0].Split(';').Length];

    for (int i = start; i < fileLines.Length; i++)
    {
        string line = fileLines[i];
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            string[] split = line.Split(';');
            matrix[i, j] = split[j]?.Trim();
        }
    }   
}

Или вы можете инициализировать ваш matrix массив в вашем методе:

string[] fileLines = File.ReadAllLines(path);
// c is number of columns, that you are using now
string[,] matrix = new string[fileLines.Length, c];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...