gpt4 book ai didi

c# - 从文件中检索字符串,当多行包含完全相同的字符串时使用 Linq 进行过滤

转载 作者:行者123 更新时间:2023-11-30 23:01:58 24 4
gpt4 key购买 nike

我正在使用 Visual Studio 和 NuGet 包 MoreLinq 来实现我的以下解决方案。

我希望检索的文件内容示例,该文件还包含其他不相关的数据:

...
#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" 出现了多次,它在第一个找到的地方停止。

我只想从提到的文件中检索这些行,而不会丢失其中一行:

#define HELLO
#include "hello.h"

code

#define BYE
#include "hello.h"

对于仍然使用 Linq 的解决方案,请参阅下面@Freggar 的回答。

最佳答案

您可以在 TakeUntil 中设置一个标志,表明您已通过 #define BYE:

bool byeFlag = false;
var p = from line in File.ReadLines(file)
.SkipWhile(l => l.TrimStart() != ("#define HELLO"))
.TakeUntil(l =>
{
bool ret = byeFlag;
if (l.TrimStart() == "#define BYE")
{
byeFlag = true;
}
return ret;
})
.ToList()
select new
{
File = file,
Line = line
};

但是正如已经提到的,对于您正在尝试做的事情,LINQ 可能并不是真正的最佳工具。也许解析器喜欢 ANTLR更适合这份工作?

关于c# - 从文件中检索字符串,当多行包含完全相同的字符串时使用 Linq 进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50735236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com