我的扩展方法是否有任何内置的.NET Framework替代方案?

时间:2012-11-07 12:44:12

标签: c# .net linq extension-methods ienumerable

在很多情况下,我使用了这个很好的方法。

internal static IEnumerable<TResult> RoundTrip<TSource, TResult>
 (this IEnumerable<TSource> e, Func<TSource, TSource, TResult> currentNextAction)
{
    using (IEnumerator<TSource> enumer = e.GetEnumerator())
    {
        if (!enumer.MoveNext())
            yield break;

        bool flag = true;
        TSource first = enumer.Current;

        do
        {
            TSource current = enumer.Current;
            TSource next = (flag = enumer.MoveNext()) ? enumer.Current : first;
            yield return currentNextAction(current, next);
        } while (flag);
    }
}

我看了MSDN一些内置替代品,但找不到它们。有没有?

而且,这段代码中有什么我可以改进的吗?

编辑:非可枚举方法的新代码。

internal static IEnumerable<TResult> RoundTrip<TSource, TResult>
 (this IEnumerable<TSource> e, Func<TSource, TSource, TResult> currentNextAction)
{
    bool flag = false;
    TSource first = default(TSource);
    TSource previous = default(TSource);

    foreach (TSource item in e)
    {
        if (!flag)
        {
            flag = true;
            first = previous = item;
            continue;
        }

        yield return currentNextAction(item, previous);
        previous = item;
    }

    if (flag)
        yield return currentNextAction(previous, first);
    else
        yield break;
}

(顺便说一下,我喜欢第一个)

2 个答案:

答案 0 :(得分:1)

没有内置任何东西,但你可以真正简化它:

var lst = e.ToList();

lst.Add(lst[0]);
var result = lst.Take(lst.Count - 1).Select((x, i) => action(x, lst[i + 1]));

答案 1 :(得分:1)

你有Enumerable.Zip

var result = e.Zip(e.Skip(1).Concat(e.Take(1)), action)

除非先列出一个列表,否则它当然会枚举两次序列(+1元素)

编辑:错过了往返