删除字符串</string>后将List <string>内容写入文本文件

时间:2013-10-24 08:23:07

标签: c# string text-files streamreader streamwriter

我正在尝试获取文本文件的内容,删除一行字符串,然后重新写回文本文件,删除字符串行。我正在使用StreamReader获取文本,导入List,删除字符串,然后使用StreamWriter重写。我的问题出现在删除或写入字符串的某处。不是将现有的,未删除的内容写回文本文件,而是将所有文本替换为:

  

System.Collections.Generic.List`1 [System.String]

此功能的代码如下:

{
            for (int i = deleteDevice.Count - 1; i >= 0; i--)
            {
                string split = "";
                //deleteDevice[i].Split(',').ToString();
                List<string> parts = split.Split(',').ToList();

                if (parts.Contains(deviceList.SelectedItem.ToString()))
                {

                    deleteDevice.Remove(i.ToString());
                }

            }
            if (deleteDevice.Count != 0) //Error Handling
            {

                writer.WriteLine(deleteDevice);

            }
        }

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

我只想让脚本写回任何未删除的字符串(如果有的话),而不替换它。任何帮助表示赞赏,干杯

3 个答案:

答案 0 :(得分:2)

您可以将文本文件中的所有信息读入列表,然后从列表中删除并将其重写为文本文件。

我会更改列表'deleteDevice'来存储字符串数组,并使用下面的代码来确定要删除的项目。

        List<int> toRemove = new List<int>();
        int i = 0;
        /*build a list of indexes to remove*/
        foreach (string[] x in deleteDevice)
        {
            if (x[0].Contains(deviceList.SelectedItem.ToString()))
            {
                toRemove.Add(i);
            }
            i++;
        }

        /*Remove items from list*/
        foreach (int fd in toRemove)
             deleteDevice.RemoveAt(fd);

        /*write to text file*/
        using (StreamWriter writer = new StreamWriter("Devices.txt"))
        {
            if (deleteDevice.Count != 0) //Error Handling
            {
                foreach (string[] s in deleteDevice)
                {
                    StringBuilder sb = new StringBuilder();
                    for (int fds = 0; fds < s.Length; fds++ )
                    {
                       sb.Append(s[fds] + ",");
                    }
                    string line = sb.ToString();
                    writer.WriteLine(line.Substring(0, line.Length - 1));
                }
            }
        }

这不是最好的解决方案,但应该可以满足您的需求。这可能是一种更简单的方法。

答案 1 :(得分:1)

<强>问题

deleteDevice的类型为List<string>,因为它也不会重载ToString()List<string>.ToString()的默认行为是返回类型的名称。< / p>

因此你的行writer.WriteLine(deleteDevice);写了字符串System.Collections.Generic.List 1 [System.String]`。

除此之外,你的代码有很多问题......

例如,你这样做:

string split = "";

然后在线上你这样做:

List<string> parts = split.Split(',').ToList();

但是因为split是“”,这将始终返回一个空列表。


<强>解决方案

为简化代码,您可以先编写一个帮助器方法,该方法将从文件中删除与指定谓词匹配的所有行:

public void RemoveUnwantedLines(string filename, Predicate<string> unwanted)
{
    var lines = File.ReadAllLines(filename);
    File.WriteAllLines(filename, lines.Where(line => !unwanted(line)));
}

然后你可以编写类似这样的谓词(这可能不太正确;我真的不知道你的代码究竟在做什么因为它不可编译而省略了一些类型):

string filename = "My Filename";
string deviceToRemove= deviceList.SelectedItem.ToString();

Predicate<string> unwanted = line => 
    line.Split(new [] {','})
    .Contains(deviceToRemove);

RemoveUnwantedLines(filename, unwanted);

答案 2 :(得分:1)

问题出在以下几行:

writer.WriteLine(deleteDevice);

您正在编写deleteDevice(我假设这是List类型)。 List.ToString()返回列表的类型名称,因为它没有特定的实现。你想要的是

foreach(String s in deleteDevice)
{
    writer.WriteLine(s);
}