我得到了这个在很多情况下都使用的好方法。
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;
}
(顺便说一下,我喜欢第一个)