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()
在我的测试中的实现与你的几乎相同。
我有一个包含几千行文本的文本文件。 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()
在我的测试中的实现与你的几乎相同。