Удаление элемента из списка ‹String›, полученного из текстового файла

Я пытаюсь удалить строку текста из текстового файла, используя StreamReader для импорта файла, добавления содержимого в список, удаления нужной строки, повторной записи в текстовый файл без строки. Однако любые попытки запустить программу, похоже, приводят либо к бесконечным циклам, либо к удалению всех строк из файла, либо к тому, что один файл не очищается совсем. Вот код, который у меня есть:

{

        string read = "";

        if (devOutput.Count() != 0) //Error Handling
        {
            using (StreamReader reader = new StreamReader("Devices.txt", true))
            {
                while ((read = reader.ReadLine()) != null)
                {
                    deleteDevice.Clear();
                    deleteDevice.Add(read);
                }
            }
        }

        else
            MessageBox.Show("2: No Devices Saved!");


        using (StreamWriter writer = new StreamWriter("Devices.txt"))
        {        
                do
                {
                    foreach (string st in deleteDevice)
                    {
                        string split = st.ToString();
                        deleteDevice = split.Split(',').ToList();
                    }

                    if (deleteDevice.Contains(deviceList.SelectedItem.ToString()))
                    {
                        deleteDevice.Remove(i.ToString());
                        i = i + 1;
                        deleteDevice.Remove(i.ToString());
                        i = i + 1;
                        deleteDevice.Remove(i.ToString());
                        i = i + 1;
                        deleteDevice.Remove(i.ToString());
                        i = i + 1;
                        deleteDevice.Remove(i.ToString());
                        i = i + 4; //Progress to next device
                    }
                }
                while (i < deleteDevice.Count);

                if (deleteDevice.Count != 0) //Error Handling
                {
                    foreach (string st in deleteDevice)
                    {
                        writer.WriteLine(st);
                    }
                }
            }

        deviceList.Items.Remove(deviceList.SelectedItem);        
    }

Если есть лучший способ сделать это, скажем, используя массив вместо списка, что было бы лучшим способом реализовать такую ​​вещь. Любая помощь приветствуется, ура


person Van Man    schedule 24.10.2013    source источник


Ответы (2)


В вашем коде есть ряд ошибок:

1) Во время чтения вы постоянно очищаете список (Of String) с именем deleteDevice

deleteDevice.Clear();  // <- This line should be removed or moved before entering the loop
deleteDevice.Add(read);

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

for(int i = deleteDevice.Count - 1; i>=0; i--)
{
    string split = deleteDevice[i].Split(',');
    List<string> parts = split.ToList(); 
    if (parts.Contains(deviceList.SelectedItem.ToString()))
    {
        deleteDevice.Remove(i);
    }
}
... write to file...
person Steve    schedule 24.10.2013

while ((read = reader.ReadLine()) != null)
                {
                    deleteDevice.Clear(); //this is the problem
                    deleteDevice.Add(read);
                }

Вы очищаете свой список во время каждой итерации цикла (т.е. каждый раз, когда вы читаете строку, вы удаляете список строк) ... вам нужно переместить deleteDevice.Clear() за пределы начала _3 _...

person Stephen Byrne    schedule 24.10.2013
comment
+1 Или просто используйте File.ReadAllLines ... - person Alexei Levenkov; 24.10.2013