TakeWhile() 多行条件

TakeWhile() with conditions in multiple lines

我有一个包含几千行文本的文本文件。 Readlines() 函数读取文件的每一行并产生 return 行。

我需要跳过这些行直到满足条件,所以这很简单:

var lines = ReadLines().SkipWhile(x => !x.Text.Contains("ABC Header"))

我要解决的问题是还有另一种情况——一旦我找到带有“ABC Header”的行,下一行必须包含“XYZ 详细信息”。基本上,该文件包含多行,其中包含文本“ABC Header”,但并非所有这些行后跟“XYZ Detail”。我只需要同时存在这两条线的那些。

我该怎么做?我尝试在 SkipWhile 之后添加 .Where,但这并不能保证“XYZ Detail”行紧跟在“ABC Header”行之后。谢谢!

// See https://aka.ms/new-console-template for more information
using Experiment72045808;

string? candidate = null;
List<(string, string)> results = new();
foreach (var entry in FileReader.ReadLines())
{
    if (entry is null) continue;
    if (candidate is null)
    {
        if (entry.Contains("ABC Header"))
        {
            candidate = entry;
        }
    }
    else
    {
        // This will handle two adjacend ABC Header - Lines.
        if (entry.Contains("ABC Header"))
        {
            candidate = entry;
            continue;
        }
        
        // Add to result set and reset.
        if (entry.Contains("XYZ Detail"))
        {
            results.Add((candidate, entry));
            candidate = null;
        }
    }
}

Console.WriteLine("Found results:");
foreach (var result in results)
{
    Console.WriteLine($"{result.Item1} / {result.Item2}");
}

导致输出:

Found results:
ABC Header 2 / XYZ Detail 2
ABC Header 3 / XYZ Detail 3

输入文件

Line 1
Line 2
ABC Header 1
Line 4
Line 5
ABC Header 2
XYZ Detail 2
Line 6
Line7
ABC Header 3
XYZ Detail 3
Line 8
Line 9

FileReader.ReadResults() 在我的测试中的实现与你的几乎相同。