问题描述
我试图将 lambda 表达式 理解为参数
当我们使用 Linq 的 Count
时:
string s = "hello";
int count = s.Count(x => x == 'h');
它如何知道 x
是 s
的元素?
解决方法
把它想象成循环迭代集合的元素并将给定的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
。
因为 string
实现了 IEnumerable<char>