2

次のソリューションには、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の回答を参照してください。

4

1 に答える 1