我需要从 C# 中的特定字符串中获取最后一次出现的日志跟踪,例如:
lines = File.ReadLines(logPath)
.SkipWhile(line => !line.Contains("param"))
.Take(20);
该代码可以工作,但它从日志中第一次出现“param”返回 20 行,而我需要最后一行。
您可以创建一个(扩展)方法,该方法向后遍历源序列,直到找到与某些谓词匹配的项目。当您搜索匹配项时,请保留您已查看过的项目堆栈,然后在找到匹配项时将其返回:
public static IEnumerable<T> SkipUntilLast<T>(
this IEnumerable<T> source, Func<T, bool> predicate)
{
var stack = new Stack<T>();
foreach(var item in source.Reverse())
{
if (predicate(item))
return stack;
stack.Push(item);
}
return Enumerable.Empty<T>();
}
Usage:
lines = File.ReadLines(logPath).
.SkipUntilLast(line => line.Contains("param"))
.Take(20);
注意Reverse
会将源序列放入缓冲区中,然后堆栈将执行类似的操作(取决于最后一个匹配是否更接近源尾部或头部)。您可以使用所需大小的队列来保留您检查的项目,因此您的案例中的项目不会超过 20 个。您还可以通过移动来决定匹配的项目是否应包含在输出中stack.Push
在谓词检查之前。
样本文件
something
param foo
this
is
not
included
param bar
here
we
go
again
跳到包含“param”的最后一行,然后取下三行:
File.ReadLines("samplefile").SkipUntilLast(line => line.Contains("param")).Take(3);
Result:
[ "here", "we", "go" ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)