【发布时间】:2012-11-07 12:44:12
【问题描述】:
我得到了这个在很多情况下都使用的好方法。
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;
}
(我喜欢第一个)
【问题讨论】:
-
您可能想解释一下它的作用。
RoundTrip()不是最具描述性的名字... -
您有具体问题吗?否则你可能想在
codereview.stackexchange.com上问这个问题。 -
Was 是代码的预期行为,它将迭代 ienumeraqble 并进一步返回第一个元素作为第一个和最后一个元素,然后停止。但是从名字上看,它听起来有点像一个“环形缓冲区”,您希望在枚举结束后重新开始枚举......
-
Codereview 在代码改进方面似乎确实有意义。我要说的一件事是,您很少需要直接使用枚举器,我认为这里没有什么不同。您可以将 current 和 next 保存在 foreach 循环范围之外的变量中,然后不必担心执行 movenext、检查返回值以及所有这些手动操作。
-
@RuneFS:在我看来,它循环遍历运行给定函数的可枚举对象,该函数针对当前值及其后面的值以及最后一个(没有后续值)它使用第一个。
标签: c# .net linq extension-methods ienumerable