2

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

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());

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

4

3 回答 3

2

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

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

MSDN

字符串是不可变的——字符串对象的内容在对象创建后不能更改,尽管语法使它看起来好像你可以这样做。

为什么 .NET 字符串是不可变的?

于 2013-08-26T14:07:38.390 回答
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());
于 2013-08-26T14:09:00.667 回答
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);
    }
}
于 2013-08-26T14:13:12.837 回答