C#文本文件字符串搜索问题:未找到时无法正确提示
C#文本文件字符串搜索问题解决
原代码存在的核心问题
- 重复读取文件:for循环的每一次迭代都重新打开并读取整个文件,完全没必要,且导致行号判断错误(变量
i和实际文件行号不对应)。 - 未找到的判断逻辑错误:用
StrLine == string.Empty判断未找到不成立,因为文件最后一行可能非空,即使搜索不到,StrLine也会是文件最后一行的内容而非空字符串。 - 找到匹配后未终止搜索:找到目标字符串后仍会继续读取文件,可能覆盖之前的结果提示。
修正后的代码
我们可以一次性逐行读取文件,同时跟踪行号,找到匹配后立即更新提示并终止搜索;如果遍历完所有行都没找到,再显示未找到提示。
private void BtnSearch_Click(object sender, EventArgs e) { string searchTerm = TxtSearchTerm.Text.Trim(); // 去除首尾空白,避免匹配错误 string textFile = Path.Combine(Application.StartupPath, "TextFile.txt"); // 用Path.Combine更安全 bool found = false; int lineNumber = 0; // 逐行读取文件,无需手动管理StreamReader foreach (string line in File.ReadLines(textFile)) { lineNumber++; if (line.Trim() == searchTerm) // 去除行首尾空白,匹配更准确 { LblSearch.Text = $"{searchTerm} 找到于行号: {lineNumber}"; found = true; break; // 找到后立即停止搜索 } } // 遍历完所有行都没找到,显示提示 if (!found) { LblSearch.Text = $"未找到单词: {searchTerm}"; } }
代码优化点说明
- 使用
File.ReadLines():逐行读取文件,内存效率高(不会一次性加载整个文件到内存),无需手动处理流的关闭。 - 引入
found标记:清晰跟踪是否找到目标字符串,避免逻辑混乱。 - 用
Path.Combine()拼接路径:避免手动拼接路径时的斜杠问题,跨平台兼容性更好。 - 增加
Trim()处理:去除搜索词和行文本的首尾空白,避免因意外空格导致匹配失败。
如果需要支持多个匹配结果(显示所有找到的行号),可以修改代码如下:
private void BtnSearch_Click(object sender, EventArgs e) { string searchTerm = TxtSearchTerm.Text.Trim(); string textFile = Path.Combine(Application.StartupPath, "TextFile.txt"); List<int> matchedLines = new List<int>(); int lineNumber = 0; foreach (string line in File.ReadLines(textFile)) { lineNumber++; if (line.Trim() == searchTerm) { matchedLines.Add(lineNumber); } } if (matchedLines.Count > 0) { LblSearch.Text = $"{searchTerm} 找到于行号: {string.Join(", ", matchedLines)}"; } else { LblSearch.Text = $"未找到单词: {searchTerm}"; } }
内容的提问来源于stack exchange,提问作者Ed Swafford
相关产品推荐
相关产品推荐

