Обновление строки файла, если элемент массива соответствует текстовому полю - PullRequest
0 голосов
/ 13 января 2020

У меня есть метод, который в настоящее время читает все строки файла каталога (3 поля в строке) и обновляет массив каталога записью записей текстового поля, если введенный код расширения совпадает с полем кода расширения в файле.

У меня был обновленный массив каталогов, отображаемый в виде списка, и как только я попытался обновить файл каталога с помощью обновленного массива, все пошло вниз! Изменить, чтобы уточнить: с последней версией кода ниже, массив больше не отображается в виде списка, и файл не обновляется. Ошибки не выдаются.

public void updateName()
    {
        int count = 0;
        string[] lines = File.ReadAllLines(directoryFile);

        // Set size of directory array equal to number of lines in file
        int lineCount = lineCounter();
        directory = new record[lineCount];

        record currentRecord = new record();

        // Iterate through each line in file
        foreach (string line in lines)
        {
            // Split current line into three fields
            string[] fields = line.Split(',');

            // Save current line as new record with surname, forename and extCode fields
            currentRecord.surname = fields[0];
            currentRecord.forename = fields[1];
            currentRecord.extCode = Convert.ToInt32(fields[2]);

            // If extension code in current record matches text box entry
            if (Convert.ToInt32(fields[2]) == Convert.ToInt32(txtExtCode.Text))
            {
                // Change surname and forname fields to match text box entries
                currentRecord.surname = txtForename.Text;
                currentRecord.forename = txtSurname.Text;

                using (StreamWriter writer = new StreamWriter(directoryFile))
                {
                    for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
                    {
                        if (currentLine == count)
                            writer.WriteLine(currentRecord);
                        else
                            writer.WriteLine(lines[currentLine - 1]);
                    }
                }
            }

            // Save currentRecord as next element in directory array, then increment
            directory[count] = currentRecord;
            count++;
        }
    }

1 Ответ

2 голосов
/ 13 января 2020

Вам не нужно linecounter(). Количество строк lines.Length. Но зачем вам этот массив directory? Вы заполняете его, но нигде не используете.

Другая важная проблема заключается в том, что вы создаете StreamWriter внутри foreach l oop. Вы должны открыть файл до l oop и закрыть его после l oop, чтобы он заработал. Кроме того, вы смешиваете запись currentRecord типа record и запись строк типа string в выходной файл. Это не может работать.

Вы также помещаете txtForename.Text в currentRecord.surname вместо currentRecord.forename и наоборот.

Я предлагаю сначала применить изменения в массиве lines и затем, чтобы записать этот массив lines обратно в файл с File.WriteAllLines, который является операцией симметрии c для File.ReadAllLines.

Я применяю изменение непосредственно к массиву fields, так что Я могу преобразовать его обратно в строку с помощью String.Join (это операция симметрии c в String.Split).

public void updateName()
{
    // Do this conversion before the loop. We need to do it only once.
    int selectedCode = Convert.ToInt32(txtExtCode.Text);

    string[] lines = File.ReadAllLines(directoryFile);
    for (int i = 0; i < lines.Length; i++)
    {
        // Split current line into three fields
        string[] fields = lines[i].Split(',');

        int extCode = Convert.ToInt32(fields[2]);
        if (extCode == selectedCode)
        {
            fields[0] = txtSurname.Text;
            fields[1] = txtForename.Text;
            lines[i] = String.Join(",", fields);

            // If the extension code is unique, leave the for-loop
            break;
        }
    }
    File.WriteAllLines(directoryFile, lines);
}

Я также использую for вместо foreach, чтобы имеют индекс i, так что я могу заменить одну строку в массиве lines с указанным индексом c.

Я не знаю, является ли код расширения в файле каталога уникальным , Если это так, вы можете преждевременно выйти из режима l oop с помощью break.

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