Индекс вне диапазона в wp7 - PullRequest
0 голосов
/ 15 июля 2011

Я пытаюсь восстановить все данные в изолированном файле хранилища.Но я получаю индекс вне диапазона ошибок.домой ^ как ^ лет ^

StreamReader readFile = new StreamReader(new IsolatedStorageFileStream("AlarmFolder\\alarm.txt", FileMode.Open, myStore));

string[] alarmDetailsSeparated;

String fileText = readFile.ReadLine();


//alarmDetailsSeparated is the array that hold the retrieved alarm details from alarm.txt and is split by '^'
alarmDetailsSeparated = fileText.Split(new char[] { '^' });

foreach (string home in alarmDetailsSeparated)
{
    for (i = 0; i < alarmDetailsSeparated.Length;)
    {
        if (test > 0)
        {
            i = test;
        }

        dateSeparate = alarmDetailsSeparated[i];
        timeSeparate = alarmDetailsSeparated[i + 1];
        labelSeparate = alarmDetailsSeparated[i + 2];

        date = dateSeparate;
        time = timeSeparate;
        label = labelSeparate;

        test = test + 3 ;
        break;
    }

    MessageBox.Show("i is " + alarmDetailsSeparated[i]);
    MessageBox.Show("i + 1 is " + alarmDetailsSeparated[i + 1]);
    MessageBox.Show("i + 2 is " + alarmDetailsSeparated[i + 2]);
}

Ответы [ 3 ]

1 голос
/ 15 июля 2011
dateSeparate = alarmDetailsSeparated[i];
timeSeparate = alarmDetailsSeparated[i + 1];
labelSeparate = alarmDetailsSeparated[i + 2];

Последние 2 строки являются проблемными: если вы зацикливаетесь от длины 0 до alarmDetailsSeperated, то нет гарантии, что текущий индекс + 1 или +2 существует, что делает этот код небезопасным (как вы видите, вы получают исключение).

Простым решением было бы изменить ваш цикл:

for (i = 0; i < alarmDetailsSeparated.Length - 2;)
1 голос
/ 15 июля 2011

В цикле вы переходите от 0 к длине alarmDetailsSeparated.Это нормально, но затем вы индексируете alarmDetailsSeparated, используя i+1 и i+2.

Это означает, что когда цикл равен alarmDetailsSeparated.Length-2, программа будет индексировать alarmDetailsSeparated.Length-2+2 = alarmDetailsSeparated.Length и выбрасывать изошибка границ.

0 голосов
/ 17 июля 2011

Хорошо, IIUC ваш файл хранения выглядит примерно так:

home^date^time^label
home^date^time^label
...

, и вы хотите выполнить обработку для каждого ввода данных тревоги в файл.

Первое, что вам нужноdo делит его на каждую строку:

string[] lines = file.ReadAllLines("alarms.dat");
foreach (line in lines) {
    // handle the alarm data entry (see below)
}

Теперь вы можете выполнять разбиение, как в своем коде:

string[] data = line.Split(new char[] { '^' });

Это должно дать вам 4 записи, если строка имеетданные, которые вы хотите, поэтому проверьте это:

if (data.Length == 4) { // looks like an alarm data entry
    // do processing on the alarm data entry (see below)
}

данные теперь могут быть извлечены:

string home = data[0];
string date = data[1];
string time = date[2];
string label = date[3];

А затем действовали:

MessageBox.Show(String.Format("home {0} at {1} on date {2} with label {3}",
                home, time, date, label));
...