为什么我可以在LINQ条件中省略一个参数?
本文关键字:一个 参数 我可以 LINQ 条件 中省 为什么 | 更新日期: 2023-09-27 18:09:05
我正在阅读关于如何搜索数组中包含的任何字符串的字符串的答案。解决方案非常简洁:
if(stringArray.Any(stringToCheck.Contains))
我的问题是,为什么Contains()
项不需要显式参数?我将把上面的代码写成:
if(stringArray.Any(s => stringToCheck.Contains(s)))
使用这个缩写版本的规则是什么?
Any
需要一个函数(Func
),(我假设stringArray
只是一个字符串)
- 接受
char
输入 - 返回
bool
。
最常用的方法是创建一个内联匿名函数(lambda表达式)。但是,您可以传递一个实际的函数。系统将遍历参数和返回类型以确保匹配,就像lambda语句一样。
碰巧的是,函数Contains
接受char
作为输入,返回bool
。这就是为什么你可以传递函数名而不是调用它(使用带参数列表的圆括号)。
以我们自己创建函数为例:
public static bool Contains2 (this string input, char c)
{
//....
}
stringArray.Any(stringToCheck.Contains2)
这也符合要求。注意Contains2上没有()
括号。这是因为我们传递的是函数本身。
您的lambda也可以工作,因为它接受char输入(s =>
)并返回bool (Contains(s)
的结果)。
因为Any
方法需要委托Func<TSource, bool>
,如果Contains方法满足它,我们可以发送方法本身,而不是创建新的匿名方法,这将只是围绕stringToCheck.Contains(s)
的包装
这是一个方法组。只有一个参数,因此编译器可以确定可以传入的内容。换句话说,stringToCheck.Contains
方法具有与Any
相同的签名。
因为这里使用了Any overload:
public static bool Any<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
,
谓词是您的stringToCheck.Contains
方法。