在下面的C#代码中,我发现_()
的使用很奇怪。任何人都能解释这意味着什么吗?
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;
}
}
}
答案 0 :(得分:15)
通过在return
语句后插入换行符可以更容易理解代码:
return _();
IEnumerable<TSource> _()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
在此上下文中,下划线只是local function的任意名称(这是C#7.0中引入的新功能)。如果您愿意,可以使用更具描述性的名称替换下划线:
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
方法的所有变量。
顺便说一下,这里有两个方法的原因是,如果任何参数为null,则在调用ArgumentNullException
时将立即抛出DistinctBy
,而不是在枚举结果时抛出yield return
由于存在jest.mock('./Service', () => jest.fn);
语句。