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

Unity中foreach循环匹配指定单词仅最后一项生效的问题求助

问题解决思路

你的核心问题是循环中每次迭代都会覆盖状态文本:就算找到了目标单词,后续不匹配的循环项会把status.text重新设为“Nu este in baza”,只有当目标是最后一项时,最后一次迭代才会保留“found”。

另外还有两个隐藏问题:

  • Windows系统的换行符是\r\n,用Split("\n"[0])分割后,每个单词末尾会带有\r,导致实际匹配时因为多了这个字符而失败
  • 分割后的数组可能包含空字符串(比如文件末尾的空行)

修改后的代码

public Text InputNrDeImt;
public Text status;
public string[] bd;
public string path;
public string NrDeImt;

public void OnCheck(){
    path = Application.persistentDataPath +"/BazaDeDate.txt";
    // 使用using自动释放资源,比手动Close更安全
    using(StreamReader reader=new StreamReader(path))
    {
        string rbd = reader.ReadToEnd();
        // 按换行符分割,同时移除空元素和多余的回车符
        bd = rbd.Split(new[] {'\n', '\r'}, StringSplitOptions.RemoveEmptyEntries);
    }
    
    NrDeImt = InputNrDeImt.text.Trim(); // 去除输入的前后空白
    bool isFound = false;

    foreach(string word in bd){
        // 去除每行的前后空白(处理可能的空格、注释?如果需要去掉#注释可以额外处理)
        string cleanWord = word.Trim();
        if(NrDeImt == cleanWord){
            isFound = true;
            break; // 找到后立刻跳出循环,避免后续覆盖
        }
    }

    // 最后统一设置状态文本
    status.text = isFound ? "found" : "Nu este in baza";
}

关键修改点

  • 用using包裹StreamReader,自动释放文件资源,避免资源泄漏
  • 分割时用StringSplitOptions.RemoveEmptyEntries移除空行,同时处理\r和\n两种换行符
  • 先初始化isFound为false,找到匹配后设为true并跳出循环,最后统一设置状态文本,避免中途被覆盖
  • 对输入和每行文本做Trim()处理,去除前后空白字符(比如用户输入时不小心加的空格,或者文本行末尾的空格)

如果你的TXT文件里存在类似aba #我要搜索的单词这种带注释的行,需要去掉#及后面的内容,可以在cleanWord处理时加一行:

cleanWord = cleanWord.Split('#')[0].Trim();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:30:36