语法含义:return _(); IEnumerable <tsource> _()

时间:2017-08-28 02:34:20

标签: c# syntax

在下面的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;
        }
    }
}

1 个答案:

答案 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); 语句。