语法的含义:return _();IEnumerable< TSource>_()
在下面的C#代码中,我发现 _()
的用法很奇怪.谁能解释这是什么意思?
In the C# code below, I found the usage of _()
strange. Can anyone explain what this means?
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
return _(); IEnumerable<TSource> _()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
}
通过在 return
语句后插入换行符,可以更容易地理解代码:
The code might be more easily understood by inserting a line break after the return
statement:
return _();
IEnumerable<TSource> _()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
In this context, the underscore is just an arbitrary name for a local function (which is a new feature introduced in C# 7.0). If you prefer, you could replace the underscore by a more descriptive name:
return DistinctByHelper();
IEnumerable<TSource> DistinctByHelper()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
作为本地函数,_(或DistinctByHelper)方法可以访问 DistinctBy
方法的所有变量.
As a local function, the _ (or DistinctByHelper) method can access all the variables of the DistinctBy
method.
顺便说一下,这里有两个方法的原因是,如果任何参数为null,则在调用 DistinctBy
而不是调用 DistinctBy
时会立即引发 ArgumentNullException
枚举结果时(由于 yield return
语句的存在).
By the way, the reason for having two methods here is so that, in case any argument is null, ArgumentNullException
will be thrown immediately when DistinctBy
is called instead of when the result is enumerated (due to the presence of the yield return
statement).