LINQ:实现 SkipLastWhile 运算符





0/5 (0投票)
LINQ:实现 SkipLastWhile 运算符
在我的上一篇博文中 (>)(>) 之后,在这篇博文中,我将介绍 SkipLastWhile
运算符的实现。
SkipLastWhile
返回序列中满足指定条件的最后一个连续元素之外的所有元素,并作为 SkipLastWhile
扩展方法实现。
public static IEnumerable<TSource> SkipLastWhile<TSource>
(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
public static IEnumerable<TSource> SkipLastWhile<TSource>
(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
这些方法的实现非常简单。我们从一个空缓冲区开始,并缓冲满足由谓词实现的条件的所有项目。每当一个项目不满足条件时,所有缓冲的项目都会被 yield
,缓冲区被清除,并且不满足条件的项目被 yield
。
var buffer = new List<TSource>();
foreach (var item in source)
{
if (predicate(item))
{
buffer.Add(item);
}
else
{
if (buffer.Count > 0)
{
foreach (var bufferedItem in buffer)
{
yield return bufferedItem;
}
buffer.Clear();
}
yield return item;
}
}
考虑项目索引的重载与谓词实现条件的调用方式不同。
var buffer = new List<TSource>();
var idx = 0;
foreach (var item in source)
{
if (predicate(item, idx++))
{
buffer.Add(item);
}
else
{
if (buffer.Count > 0)
{
foreach (var bufferedItem in buffer)
{
yield return bufferedItem;
}
buffer.Clear();
}
yield return item;
}
}
您可以在 CodePlex 项目中找到此运算符(以及更多运算符)的完整实现,用于 LINQ 工具和运算符:PauloMorgado.Linq。