<分区>
我看了天才的几种扩展方法的实现 MoreLINQ - 项目。我遇到了一种我无法解释的风格习惯。也许你们中的一些人可以?
它发生在例如 Pairwise.cs 中,引用如下。
那么为什么作者要编写一个名为_()
的局部函数只是为了在返回表达式中调用它呢?在函数中直接实现 yield return
/yield break
不是很直接吗?我怀疑它与编译器从 yield 实现中生成 Enumerator 对象的方式有关。但我看不出有什么不同。 实际上什至发生了一些关闭事件 - 我认为那更糟(!?)
编辑:不,它不应该被关闭,因为它不是一个 lambda,而是一个局部函数,无论它们是什么,它只会获取外部作用域变量。
public static IEnumerable<TResult> Pairwise<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TSource, TResult> resultSelector)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (resultSelector == null) throw new ArgumentNullException(nameof(resultSelector));
return _(); IEnumerable<TResult> _()
{
using (var e = source.GetEnumerator())
{
if (!e.MoveNext())
yield break;
var previous = e.Current;
while (e.MoveNext())
{
yield return resultSelector(previous, e.Current);
previous = e.Current;
}
}
}
}