更新csv文件中的行

时间:2013-08-26 14:04:15

标签: c# string

尝试在文件中实现更新字符串的某些部分 目前制作一些代码

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(filePath);

string[] line = sr.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
List<string> lines = new List<string>();

string eventName = ','+eventNameUpdateTextBox.Text.ToString()+',';
foreach (var l in line)
{
    if (l.Contains(eventName))
    {
        int start = l.IndexOf(eventName);
        l.Remove(start, eventName.Length);
        l.Insert(start, newNameTextBox.Text.ToString());
        lines.Add(l);
    }
    else
    {
        lines.Add(l);
    }   
}

string toCsvOutput = string.Join(Environment.NewLine, lines.ToArray());

但结果 - 和以前一样的文件。
尝试调试它,结果看,该函数

  l.Insert(start, newNameTextBox.Text.ToString());

不要更改字符串并返回与开头相同的字符串/为什么会发生?我哪里错了?

3 个答案:

答案 0 :(得分:2)

字符串是不可变的,这意味着它们无法改变。您需要创建一个新字符串并将其分配给变量。

l = l.Remove(start, eventName.Length);
l = l.Insert(start, newNameTextBox.Text.ToString()); 

MSDN

  

字符串是不可变的 - 字符串对象的内容不能   在创建对象后更改,尽管语法可以实现   好像你可以这样做。

Why .NET String is immutable?

答案 1 :(得分:1)

字符串上的

函数返回结果字符串,但不更改字符串的值(如果不是全部则更改大部分字符串)

试试这个:

    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    StreamReader sr = new StreamReader(filePath);

    string[] line = sr.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
    List<string> lines = new List<string>();

    string eventName = ','+eventNameUpdateTextBox.Text.ToString()+',';
    foreach (var l in line)
    {
        if (l.Contains(eventName))
        {
            int start = l.IndexOf(eventName);
            l = l.Remove(start, eventName.Length);
            l = l.Insert(start, newNameTextBox.Text.ToString());
            lines.Add(l);
        }
        else
        {
            lines.Add(l);
        }   
    }
    string toCsvOutput = string.Join(Environment.NewLine, lines.ToArray());

答案 2 :(得分:1)

您必须将更改分配给新的(字符串)变量。此字符串变量不能是l,因为它是foreach loop中迭代的那个,因此无法更改。您必须依赖临时变量,如下面的代码所示。

foreach (var l in line)
{
    if (l.Contains(eventName))
    {
        string temp = l;
        int start = l.IndexOf(eventName);
        temp = temp.Remove(start, eventName.Length);
        temp = temp.Insert(start, newNameTextBox.Text.ToString());
        lines.Add(temp);
    }
    else
    {
        lines.Add(l);
    }
}