使用 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');
它怎么知道x
是s
的元素?
【问题讨论】:
您能澄清一下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<char>
【讨论】:
以上是关于使用 lambda 表达式作为参数的主要内容,如果未能解决你的问题,请参考以下文章
将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式
Kotlin函数 ⑥ ( 函数参数为 Lambda 表达式 | Lambda 表达式作为参数的简略写法 | 唯一参数的简略写法 | 最后一个参数的简略写法 )