尝试删除字符串的最后一个字符时出错

error when trying to remove last character of a string

我正在尝试删除字符串的最后一个 ",",但是我收到一条错误消息,指出

System.ArgumentOutOfRangeException: 'StartIndex cannot be less than zero.

字符串写入文件正常,但在 运行 出现上述错误时中断。我不确定为什么会这样,如有任何建议,我们将不胜感激。

我使用的代码如下

for (int z = 0; z <= totalNumberOfCaves; z++)
    {
        for (int i = 0; i < totalNumberOfCaves && connectionStack.Count > 0; i++)
        {
            connectionData.Add(int.Parse(connectionStack.Pop()));
        }
        string fileName2 = @"D:\UNI\Year 5\AI - SET09122\SET09122 - CW1\WriteConnectionData.txt";
        string writeUnEditedData = "";        
        foreach (int s in connectionData)
        {
            writeUnEditedData += (s + ",");
        }
    using (StreamWriter sw = File.AppendText(fileName2))
    {
        string writeData = writeUnEditedData.Remove(writeUnEditedData.Length - 1);
        sw.Write("{ " + writeData + " }," + Environment.NewLine);            
    }
    connectionData.Clear();
}

这通常意味着字符串为空。

尝试将此保护代码放入:

string writeData = string.IsNullOrEmpty(writeUnEditedData)
    ? string.Empty
    : writeUnEditedData.Remove(writeUnEditedData.Length - 1);

在循环中追加 string

    foreach (int s in connectionData)
    {
        writeUnEditedData += (s + ",");
    }

不是一个好主意。放 Join:

    writeUnEditedData = string.Join(",", connectionData); 

完成此操作后,您无需删除任何内容:

 using (StreamWriter sw = File.AppendText(fileName2))
 { 
     // No Remove here
     string writeData = writeUnEditedData;
     ...

在执行删除之前添加检查以查看 writeUnEditedData 是否不是空字符串。一个空字符串将导致一个 Remove(-1) ,我认为这会引发一个错误,即 StartIndex 不能小于 0.

尝试 string.TrimEnd():

writeUnEditedData = writeUnEditedData.TrimEnd(',');

您可以改进此模式:

string writeUnEditedData = "";        
foreach (int s in connectionData)
{
    writeUnEditedData += (s + ",");
}

首先要避免添加逗号:

string delimiter = "";
string writeUnEditedData = "";        
foreach (int s in connectionData)
{
    writeUnEditedData += $"{delimiter}{s}";
    delimiter = ",";
}

StringBuilder...虽然与流行的看法相反,这仅在 connectionData 集合有点大时才有用:

string delimiter = "";
var writeUnEditedData = new StringBuilder();        
foreach (int s in connectionData)
{
    writeUnEditedData.Append(delimiter).Append(s);
    delimiter = ",";
}

更好的是,流式传输整个内容,以避免需要所有额外的内存和处理:

string fileName2 = @"D:\UNI\Year 5\AI - SET09122\SET09122 - CW1\WriteConnectionData.txt";
using (var sw = new StreamWriter(fileName2, true))
{
    for (int z = 0; z <= totalNumberOfCaves; z++)
    {
        string delimiter = "";
        for (int i = 0; i < totalNumberOfCaves && connectionStack.Count > 0; i++)
        {
            sw.Write(delimiter);
            sw.Write(connectionStack.Pop());
            delimiter = ",";
        }
        sw.Write(Environment.NewLine);
    }
}