C# 哪些行没有读过?流阅读器

C# 哪些行没有读过?流阅读器,c#,streamreader,C#,Streamreader,我正在开发一个复杂格式的文件阅读器。实际上有数百种不同的条目。在我现在这样做的时候,我需要使用两个StreamReader,因为我之前需要提取一些信息。这些文件足够大,不能立即读取 我想要的是通知用户哪些行没有被读取。我的结构是这样的: Streamreader file1 = new Streamreader(path); while((line=file1.Readline()) != null) { if(line.StartsWith("HELLO") { //... } //

我正在开发一个复杂格式的文件阅读器。实际上有数百种不同的条目。在我现在这样做的时候,我需要使用两个StreamReader,因为我之前需要提取一些信息。这些文件足够大,不能立即读取

我想要的是通知用户哪些行没有被读取。我的结构是这样的:

Streamreader file1 = new Streamreader(path);
while((line=file1.Readline()) != null)
{
     if(line.StartsWith("HELLO")
{
//...
}
//... more conditions
}



Streamreader file2 = new Streamreader(path);
while((line=file2.Readline()) != null)
{
     if(line.StartsWith("GOOD MORNING")
{
//...
}
//...more conditions 
}
因此,如果我的读者在结尾是完美的,那么所有的行都会被阅读。由于事情可能很奇怪,一些条目可能还没有实现,我想抓住这一点。正如您所看到的,这里的问题是有两个StreamReader

我的选择是:

将所有未读取的行存储在数组中,然后将其用于第二次读取,读取后逐行减去。不太好,因为我将在那里存储数千行。 将第二个StreamReader中的所有条件添加到第一个all added中,这样我就知道第二次将读取哪些行。比前一个更好,但我需要在几个地方修改代码,使其正常运行。我的意思是,当我想要实现读取新条目的第二个StreamReader时,我也需要修改第一个StreamReader。
有没有什么建议或更好的方法

我将创建一些谓词函数转换行,即:

class PredicateResult{
    public En_LineType type;
    public String data;
}

private PredicateResult FirstReader(String line){
    if(line.StartsWith("HELLO")){
        return new PredicateResult{
            type = En_LineType.Hello,
            data = ...
        }
    }
}

这样,您就有两个函数可以用来检查行是否与其中任何一个匹配。此外,您可以轻松地更改匹配行的条件,并支持不同的格式。

有许多字符串搜索算法。它们中的大多数都使用哈希和窗口算法,您可以从中获得一些想法

每种算法在一般复杂度或最坏情况等方面都略有不同。您可以选择一种最适合您的应用程序的算法:


每次通读时都要记录行号,如果行号不符合您的任何条件,则将其添加到集合中,这有什么不对?