在很多情况下,我使用了这个很好的方法。
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;
}
(顺便说一下,我喜欢第一个)
答案 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元素)
编辑:错过了往返