【问题标题】:error when trying to remove last character of a string尝试删除字符串的最后一个字符时出错
【发布时间】:2018-12-03 14:39:32
【问题描述】:

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

System.ArgumentOutOfRangeException: 'StartIndex 不能小于零。

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

我使用的代码如下

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

【问题讨论】:

  • 只是猜测:不应该是z &lt;= totalNumberOfCaves 而应该是z &lt; totalNumberOfCaves
  • writeUnEditedData = string.Join(",", s); 而不是循环
  • @RenéVogt 该死的,我完全看错了。已经完成了,谢谢!

标签: c# string trim


【解决方案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;
     ...

【讨论】:

  • OP 也可以删除.Remove 代码,因为不再需要了
【解决方案2】:

试试string.TrimEnd():

writeUnEditedData = writeUnEditedData.TrimEnd(',');

【讨论】:

  • @MongZhu:确实如此,因为它的发生正是因为试图通过索引空字符串的最后一个字符来删除不存在的逗号。 TrimEnd 避免了这种情况(但使用 Join 所以不需要修剪显然更好)。
  • 使用这个不会出现异常。因为它只是在寻找“,”
【解决方案3】:

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

【讨论】:

  • @MongZhu,可能是;如果writeUnEditedData 是一个空字符串,它也会抛出该异常
【解决方案4】:

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

试着把这个守卫代码放进去:

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

【讨论】:

    【解决方案5】:

    您可以改进这种模式:

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

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 2013-07-29
      • 2017-08-19
      • 2012-06-05
      相关资源
      最近更新 更多