C# 在文本文件中搜索直到指定字符串
我正在写一个程序来搜索文本文件,每个文本文件中都有一个特定的字符串。目标是忽略该字符串之后的所有内容。我当前的代码读取整个文本文件,并返回找到术语的结果文件名的可枚举项C# 在文本文件中搜索直到指定字符串,c#,performance,linq,C#,Performance,Linq,我正在写一个程序来搜索文本文件,每个文本文件中都有一个特定的字符串。目标是忽略该字符串之后的所有内容。我当前的代码读取整个文本文件,并返回找到术语的结果文件名的可枚举项 var searchResults = files.Where(file => File.ReadAllText(file.FullName).Contains(searchTerm)).Select(file => file.FullName); 是否可以合并忽略该特定字符串之后的所有行?性能非常重要,因为有数千
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.ReadAllText
,而不是使用File.ReadLines
,它是惰性计算的,当满足条件时应该停止读取
为了加快速度,还可以使用并行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<string> result = new List<string>();
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();
}
static string[]SearchFiles(string[]filesrc,string searchTerm)
{
列表结果=新列表();
字符串行=”;
StreamReader=null;
for(int i=0;i
并像这样使用:string[]files=SearchFiles(yourfiles[],“searchTerm”)代码>
根据需要,您可以将File[]
传递到此方法,然后使用fullpath获取字符串值,但是您没有提供File
类的示例,并且在不知道类的实际外观的情况下很难实现它
附言。
使用LINQ是另一个可能的解决方案,也是一个很好的解决方案(更不用说它只需要1-2行代码)
即兴显示,在这种情况下,LINQ只慢10-20%,因此最好还是坚持使用它。是否希望返回行(直到找到搜索的字符串)而不是文件名?这些文件有多重?对于大型文本文件,性能可能非常关键。