Индекс вышел за пределы массива? C# формы

Я пытаюсь прочитать следующий текстовый файл:(пропуская первые 8 строк) И читая из стрелки каждый столбец

И я делаю это, помещая каждое значение столбца в массив, который продиктован положением и длиной

Чтобы проверить, действительно ли значение массива захватило значение столбца, я хочу увидеть значение [0], когда я нажимаю другую кнопку. Но когда я запускаю свое приложение, я получаю сообщение об ошибке, что мой индекс выходит за пределы массива? Как, когда мой размер массива равен 3, и я не иду дальше этого.

    string[] val = new string[3 ]; // One of the 3 arrays - this stores column values

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {

            string[] lines = File.ReadAllLines(ofd.FileName).Skip(8).ToArray();
            textBox1.Lines = lines;

             int[] pos = new int[3] { 3, 6,18}; //setlen&pos to read specific clmn vals
             int[] len = new int[3] {2, 10,28}; // only doing 3 columns right now



             foreach (string line in textBox1.Lines)
             {
                 for (int j = 0; j <= 3; j++)
                 {
                     val[j] = line.Substring(pos[j], len[j]); // THIS IS WHERE PROBLEM OCCURS
                 }

             }

        }
    }

    private void button2_Click(object sender, EventArgs e)
    {   // Now this is where I am testing to see what actual value is stored in my    //value array by simply making it show up when I click the button.

        MessageBox.Show(val[0]);
    }
}

}

3 ответа

Решение

Массивы 0 индексируется, это означает, что массив с 3 элементами будет иметь элементы по индексам 0, 1, а также 2,

3 вне границ, поэтому, когда вы пытаетесь получить доступ pos[3] или же len[3]Ваша программа сгенерирует исключение.

использование j < 3 вместо j<=3

 for (int j = 0; j < 3; j++)
 {
     val[j] = line.Substring(pos[j], len[j]); // THIS IS WHERE PROBLEM OCCURS
 }

Массив pos имеет три значения в нем.

Рассмотрим ваш цикл.

  1. Сначала я ноль. Это меньше или равно трем.
  2. Тогда я один. Это меньше или равно трем.
  3. Тогда мне два года. Это меньше или равно трем.
  4. Тогда мне три года. Это меньше или равно трем.
  5. Тогда мне четыре года. Это не меньше или равно трем.

Он выполняет тело цикла 4 раза. Есть 3 предмета.

Для исправления, чтобы следовать стандартным соглашениям, просто используйте меньше чем, а не меньше или равно, в проверке состояния вашего for петля.

Проблема в том, что вы идете до j == 3 в forзаявление. Это будет четвертый элемент, так как массивы начинаются с нуля, поэтому измените for заявление для:

for (int j = 0; j < 3; j++)

и тебе будет хорошо идти.

Другие вопросы по тегам