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

C# WinForm:TextBox关键词匹配行写入功能报错求助

问题分析与解决方案

原代码存在的错误

  • 空引用异常:数组text1从索引1开始填充,索引0未赋值;且固定设置rows=5000,当TextBox1的文本行数不足5000时,数组后续元素为null,遍历到null时调用s.Contains(flag)会触发NullReferenceException。
  • 逻辑冗余与风险:每次遍历不匹配的行时都会将TextBox2设置为"Not Found",若匹配行出现在遍历序列中间,前面的无效赋值会被覆盖,但空元素会直接中断程序执行,无法完成匹配逻辑。

修正后的代码(简化版)

// 直接按换行符分割TextBox1的文本,无需TextReader
string[] lines = TextBox1.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
string flag = "healthy";
bool found = false;

foreach (string line in lines)
{
    // 先判断行不为空,再检查关键词
    if (!string.IsNullOrEmpty(line) && line.Contains(flag))
    {
        TextBox2.Text = line;
        found = true;
        break; // 找到第一个匹配项后停止遍历
    }
}

// 仅在遍历结束后未找到匹配项时设置提示
if (!found)
{
    TextBox2.Text = "Not Found";
}

保留TextReader的修正版本

如果坚持使用TextReader读取,可改为逐行读取直到末尾,避免固定行数限制:

using (TextReader read = new StringReader(TextBox1.Text))
{
    string flag = "healthy";
    string line;
    bool found = false;

    // 逐行读取,直到ReadLine返回null(文本末尾)
    while ((line = read.ReadLine()) != null)
    {
        if (line.Contains(flag))
        {
            TextBox2.Text = line;
            found = true;
            break;
        }
    }

    if (!found)
    {
        TextBox2.Text = "Not Found";
    }
}

代码说明

  1. 简化行读取:用Split直接分割文本,避免固定数组的冗余操作,同时规避空元素问题。
  2. 空值防护:遍历前判断行是否为空,防止空引用异常。
  3. 优化匹配逻辑:用found标记记录匹配状态,仅在遍历结束后统一处理未找到的情况,避免中间无效赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:40:33