Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在文本文件中搜索直到指定字符串_C#_Performance_Linq - Fatal编程技术网

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%,因此最好还是坚持使用它。

是否希望返回行(直到找到搜索的字符串)而不是文件名?这些文件有多重?对于大型文本文件,性能可能非常关键。