You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#查找子串时循环无限执行问题求助

问题原因及修复方案

核心问题:字符串不可变性导致Remove未生效

C# 里的string是不可变类型,所有对字符串的修改方法(比如Remove、TrimEnd、ToUpper)都不会直接修改原字符串,而是返回一个新的字符串对象。你的代码调用这些方法后没有把返回值重新赋值给原变量,导致contentOfFile始终是最初读取的完整内容,循环永远在处理同一个起始位置,自然会重复输出首个匹配结果,且无法终止。

其他潜在问题

  • catalogType.ToUpper():调用后未赋值,变量不会发生任何变化
  • contentOfFile.TrimEnd():未接收返回值,原字符串末尾的空白不会被移除
  • Substring(startPosition, endPosition):Substring的第二个参数是截取长度,不是结束索引,当前写法会导致截取长度错误,甚至抛出索引越界异常

修复后的代码

private void textToFind(string file, string catalogType)
{
    richTextBox1.Clear();
    // 修正:接收ToUpper的返回值
    catalogType = catalogType.ToUpper();
    string contentOfFile = File.ReadAllText(file);
    // 修正:接收TrimEnd的返回值
    contentOfFile = contentOfFile.TrimEnd();
    int startPosition, endPosition;
    
    while (contentOfFile.Length > 20)
    {
        startPosition = contentOfFile.IndexOf("id");
        endPosition = contentOfFile.IndexOf("imagePath");
        
        if (startPosition >= 0 && endPosition > startPosition)
        {
            int idOffset = 4;
            int imagePathOffset = 3;
            int actualStart = startPosition + idOffset;
            // 修正:计算截取长度 = 结束位置 - 起始位置
            int extractLength = (endPosition - imagePathOffset) - actualStart;
            string dataToExtract = contentOfFile.Substring(actualStart, extractLength);
            richTextBox1.AppendText(dataToExtract + "\r\n");
            
            // 修正:计算需要移除的范围,接收Remove的返回值
            int removeStart = startPosition;
            // 移除从"id"开始到"imagePath"结束的整个片段
            int removeLength = endPosition + "imagePath".Length - startPosition;
            contentOfFile = contentOfFile.Remove(removeStart, removeLength);
        }
        else
        {
            richTextBox1.AppendText("fail " + catalogType + "\r\n");
            // 修正:接收Remove的返回值
            contentOfFile = contentOfFile.Remove(contentOfFile.Length / 2);
        }
    }
}

关键修复点说明

  1. 所有字符串修改操作后,必须将返回值重新赋值给原变量(比如contentOfFile = contentOfFile.Remove(...)),才能让后续循环处理更新后的内容
  2. 修正Substring的参数为截取长度,避免索引越界错误
  3. 重新计算Remove的起始位置和长度,确保每次处理后移除已匹配的片段,让下一次循环能定位到新的匹配项

内容的提问来源于stack exchange,提问作者skyppye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:25:20