string.Contains作为谓词而不是函数调用?

时间:2018-05-03 09:07:51

标签: c# linq predicate

我在SO上找到了这个代码示例(不记得从哪里:/),它允许我在启动我的应用程序时检查行代码参数:

if (e.Args.Length == 0 || e.Args.Any("-show".Contains))
{
  //show interface...
}

我似乎无法理解"-show".Contains的工作原理。 如果与(经典)x => x.Contains('"-show")有任何区别(除了明显的打字增益)。

像魅力一样工作,但我想明白为什么,我觉得有些大事是hapening。

4 个答案:

答案 0 :(得分:20)

此:

.Any("-show".Contains)

基本上是简写:

.Any(s => "-show".Contains(s))

Any方法将委托作为参数,您可以通过多种方式创建该委托。第一个代码段使用方法组,而第二个代码段使用Lambda。

说第一个是第二个的简写是不正确的,因为方法组早于Lambdas,但是如果你在调用LINQ方法时考虑Lambdas,那么实际上就是这种情况。

答案 1 :(得分:4)

正如@jmcilhiney已经说过的那样,简写为:

.Any(s => "-show".Contains(s))

Contains是一个接受1参数的函数,其类型为string(并返回一个布尔值)。在这种情况下,Any()需要一个需要1个param的函数,它是一个字符串并返回一个布尔值。因此,您可以直接返回s=>

,而不是添加额外的lambda warapper .Contains

在技术方面,这是:

Func<string, boolean> //1 param string, output: boolean

请注意,此代码匹配属于-show

的任何参数

因此,以下任一参数都匹配!

-show
-s
sh
ow
h
w
// etc..

答案 2 :(得分:4)

Any()需要Func<TSource, bool>代表。因此,可以应用任何返回bool并且接受与集合元素(在您的情况下为string)类型相同的参数的函数。这可以是现有函数,也可以是lambda表达式。

String.Contains的签名是

bool Contains(string s)

这就是为什么你可以将它传递给Any()

的原因

答案 3 :(得分:1)

相当于x => "-show".Contains(x),而不是您展示的内容。

之后你会意识到,通过引入基于x的lambda,你所做的就是创建一个接受单个string参数并返回bool包装接受单个string并返回bool的函数。不需要包装器。