为什么我可以在LINQ条件中省略一个参数?

本文关键字:一个 参数 我可以 LINQ 条件 中省 为什么 | 更新日期: 2023-09-27 18:09:05

我正在阅读关于如何搜索数组中包含的任何字符串的字符串的答案。解决方案非常简洁:

if(stringArray.Any(stringToCheck.Contains))

我的问题是,为什么Contains()项不需要显式参数?我将把上面的代码写成:

if(stringArray.Any(s => stringToCheck.Contains(s)))

使用这个缩写版本的规则是什么?

为什么我可以在LINQ条件中省略一个参数?

Any需要一个函数(Func),(我假设stringArray只是一个字符串)

  1. 接受char输入
  2. 返回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方法。