使用 lambda 表达式作为参数

Posted

技术标签:

【中文标题】使用 lambda 表达式作为参数【英文标题】:Using lambda expression as a parameter [duplicate] 【发布时间】:2021-07-11 12:25:27 【问题描述】:

我试图将 lambda 表达式理解为参数

当我们使用 Linq 的Count:

string s = "hello";

int count = s.Count(x => x == 'h');

它怎么知道xs 的元素?

【问题讨论】:

您能澄清一下how does it know x is element of s 的意思吗?你不明白什么是 lambda 表达式吗?你不明白它们是如何在Count() 方法的上下文中使用的吗?你不明白如何枚举字符串吗? 网站上不乏解释 lambda 表达式的信息。见重复。在您的示例中,x 只是 lambda 表示的匿名方法的参数;它“知道”该值,因为调用者,Count() 创建的迭代器,传递值,就像任何调用者将任何值传递给任何其他方法一样。 【参考方案1】:

把它想象成循环遍历集合元素并将给定的lamba应用于每个元素:

var count = 0;
foreach(var x in s)
    if(x == 'h')
        count++;

或使用 lambda 表达式:

Func<char, bool> predicate = (c) => c == 'h';
var count = 0;
foreach(var x in s)
    if(predicate(c))
        count++;

这是 LINQ Count 方法的源代码:

public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

    if (source == null)
    
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
    

    if (predicate == null)
    
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.predicate);
    

    int count = 0;
    foreach (TSource element in source)
    
        checked
        
            if (predicate(element))
            
                count++;
            
        
    

    return count;

所以您可以看到它与之前的实现几乎相同,但它使用通用参数 TSource 而不是硬编码 char

【讨论】:

【参考方案2】:

因为string 实现了IEnumerable&lt;char&gt;

【讨论】:

以上是关于使用 lambda 表达式作为参数的主要内容,如果未能解决你的问题,请参考以下文章

将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

Kotlin函数 ⑥ ( 函数参数为 Lambda 表达式 | Lambda 表达式作为参数的简略写法 | 唯一参数的简略写法 | 最后一个参数的简略写法 )

在 Dispatcher.Invoke() 中使用 lambda 表达式作为参数

C++Lambda表达式作为参数

C++Lambda表达式作为参数

C++Lambda表达式作为参数