尝试删除字符串的最后一个字符时出错
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);
}
}
我正在尝试删除字符串的最后一个 ","
,但是我收到一条错误消息,指出
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);
}
}