在文本文件中搜索,直到特定字符串

我正在编写一个程序来搜索文本文件,每个文件都有一个特定的字符串。 目标是忽略该字符串后的所有内容。 我当前的代码读取整个文本文件并返回一个Enumerable结果文件名,其中找到了一个术语。

var searchResults = files.Where(file => File.ReadAllText(file.FullName).Contains(searchTerm)).Select(file => file.FullName); 

是否有可能在该特定字符串之后合并忽略所有行? 性能非常重要,因为有数千个文件。

您可以将查询更改为:

 var searchResults = files.Where(file => File.ReadLines(file.FullName).Any(line => line.Contains(searchTerm)) .Select(file => file.FullName)); 

您可以使用经过延迟评估的File.ReadLines ,而不是使用File.ReadLines ,并在满足条件时停止读取。

https://msdn.microsoft.com/en-us/library/vstudio/dd383503(v=vs.100).aspx

为了加快速度,您还可以使用Parallel LINQ:

 var searchResults = files.AsParallel() .Where(file => File.ReadLines(file.FullName).Any(line => line.Contains(searchTerm)) .Select(file => file.FullName)); 

您可以逐行读取文件,如果找到值则关闭它:

  static string[] SearchFiles(string[] filesSrc, string searchTerm) { List result = new List(); string line = ""; StreamReader reader = null; for (int i = 0; i < filesSrc.Length; i++) { reader = new StreamReader(filesSrc[i]); while ((line = reader.ReadLine()) != null) if (line.Contains(searchTerm)) { result.Add(filesSrc[i]); break; } } reader.Dispose(); return result.ToArray(); } 

并使用它: string[] files = SearchFiles(yourfiles[], "searchTerm");

根据您的需要,您可以将File[]传递给此方法,然后使用完整路径获取字符串值,但是您没有提供File类的示例,并且在不知道您的类实际看起来像什么的情况下很难实现它。

PS使用LINQ是另一种可能的解决方案,也是一种很好的解决方案(更不用说它只是1-2行代码)。

简易性能测试表明LINQ在这种情况下只减慢了10-20%,因此坚持使用它可能更好。