Не удается найти причину IndexOutOfRangeException

У меня возникает странная проблема с исключением indexOutOfBounds. Мне нужно прочитать первый символ каждой строки в массиве.

Я получаю исключение в 5-й строке (linesRead[i][0]). Самое странное для меня то, что когда я пытался добавить строки для отладки, Console.WriteLine(linesRead[0][0])/Console.WriteLine(linesRead[linesRead.Length-1][0]) работает нормально.

string[] linesRead = System.IO.File.ReadAllLines(@"test.txt"); //Just a bunch of lines

for (int i = 0; i < linesRead.Length; i++)
{
    if (linesRead[i][0] == '5')
    {
        //Do stuff
    }
}

The text inside of test.txt:
5|f-----g-----c---g-----a---|

6|--c-----------------------|
5|---Aa-f-----g-----c-------|

5|------ccdf-ff-----g-----c-|

6|--------------c-----------|
5|--g-----a------Aa-f-----g-|

5|----c-------------ccdf-f--|

person Gytis Dokšas    schedule 22.08.2019    source источник
comment
Что это за строки? Нам нужен минимально воспроизводимый пример. Одна из строк случайно не пуста?   -  person    schedule 22.08.2019
comment
Первая строка должна быть пустой. По крайней мере, я не могу думать ни о какой другой причине.   -  person div    schedule 22.08.2019
comment
На самом деле любая пустая строка вызовет ошибку.   -  person D Stanley    schedule 22.08.2019
comment
В только что добавленном тексте есть пустые строки. Используйте отладчик, чтобы идентифицировать эти вещи. linesRead[i] имеет значение, и вы можете установить точку останова в коде и использовать окно наблюдения, чтобы узнать, что это за значение. Несколько человек поняли, что в какой-то момент это пустая строка. И вот: некоторые из ваших строк пусты.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 22.08.2019


Ответы (4)


if (linesRead[i][0] == '5') вызовет эту ошибку, если строка пуста.

Пытаться

if (linesRead[i].StartsWith("5"))

вместо.

person D Stanley    schedule 22.08.2019

На всякий случай я бы проверял каждую строку null/пусто.

var linesRead = System.IO.File.ReadAllLines(@"test.txt"); //Just a bunch of lines

foreach (var line in linesRead)
{
    if (!string.IsNullOrEmpty(line) && line[0] == '5')
    {
        //Do stuff
    }
}
person Tom Faltesek    schedule 22.08.2019

Это означает, что у вас есть пустая строка где-то в вашем файле.

Вы можете пропустить эти строки с помощью:

if (linesRead[i].Length > 0 && linesRead[i][0] == '5')
person Xiaoy312    schedule 22.08.2019

В случае, если у вас есть пустая строка, символ linesRead[i][0] равен '\0' (он используется для обозначения конца строки).

Если вы измените свою строку 5 на if(linesRead[i].Length > 0 && linesRead[i][0] == '5')), вы можете пропустить случаи пустой строки.

person Royce Yang    schedule 22.08.2019