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_
相关产品推荐
相关产品推荐

