65.9K
CodeProject 正在变化。 阅读更多。
Home

LINQ:实现 SkipLastWhile 运算符

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2010年10月20日

CPOL
viewsIcon

12318

LINQ:实现 SkipLastWhile 运算符

free hit counters

在我的上一篇博文中 (>)(>) 之后,在这篇博文中,我将介绍 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

© . All rights reserved.