Enumerable.Where 的签名是:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
这个:
input.Where(i => Char.IsDigit(i))
等价于写成:
Func<char, bool> temp = i => Char.IsDigit(i);
input.Where(temp);
所以它创建了一个带有参数i
的匿名函数,并调用Char.IsDigit
。
这个:
input.Where(Char.IsDigit)
等同于
Func<char, bool> temp = Char.IsDigit;
input.Where(temp);
等同于:
Func<char, bool> temp = new Func<char, bool>(Char.IsDigit);
input.Where(temp);
它创建了一个委托到Char.IsDigit
,然后将其传递给input.Where
方法。
因此,第二个方法移除了"中间人"(即匿名函数)。在这种特定情况下,这是"合法的",因为匿名函数的i
参数被直接传递给了Char.IsDigit
。如果情况不同,那么结果就会不同:
input.Where(i => !Char.IsDigit(i))
在这种情况下,您无法删除中间人(匿名函数)。
对于所有这些内容,没有名称(或者您可以将第一个称为“创建并传递代理到匿名函数”,第二个称为“创建并传递从方法组创建的代理”……但它们不是美丽的口号,它们更像是对你正在做什么的描述)
arg => fct (arg)
与直接使用fct
“对象”(而不是函数的应用)是相同的。这在适用时允许一些可能的编译器优化(例如,请参见@Dennis_E的链接)。 - Sehnsucht