次のソリューションには、NuGet パッケージ MoreLinq を使用して Visual Studio を使用しています。
取得したいファイルの内容の例。ファイルには他の無関係なデータも含まれています。
...
#define HELLO
#include "hello.h"
code
#define BYE
#include "hello.h"
...
私が望むことをほぼ正確に行うソリューションへの私の試み。しかし、それが理にかなっている理由はわかります。
var files = from file in Directory.EnumerateFiles(path, ".", SearchOption.AllDirectories).Where(s => s.EndsWith(".c") || s.EndsWith(".h"))
from line in File.ReadLines(file)
.SkipWhile(l => l.TrimStart() != ("#define HELLO"))
.TakeUntil(l => l.TrimStart() == ("#define BYE"))
.ToList()
select new
{
File = file,
Line = line
};
foreach (var f in files)
{
sotredLines.Add(f.Line.Trim());
}
この時点で、私のソリューションは次の結果をもたらします。
#define HELLO
#include "hello.h"
code
#define BYE
気付かなかった場合は、取得したかった最後の行 -> #include "hello.h"が欠落しています。この問題を解決するための私の試みは、次の行をコードに追加することでした
...
.SkipWhile(l => l.TrimStart() != ("#define HELLO"))
.TakeUntil(l => l.TrimStart() == ("#define BYE"))
.TakeUntil(l => l.TrimStart() == ("#include \"hello.h\""))
...
しかし、これは(予想どおり)次の結果のみを返しました。
#define HELLO
#include "hello.h"
残りの必要な情報を完全に無視します。#include "hello.h"が複数回出現し、最初に見つかったもので停止するためです。
上記のファイルから次の行のみを取得し、行の 1 つも欠落させないようにします。
#define HELLO
#include "hello.h"
code
#define BYE
#include "hello.h"
解決策については、まだLinqを使用している場合は、以下の@Freggarの回答を参照してください。