我在SO上找到了这个代码示例(不记得从哪里:/),它允许我在启动我的应用程序时检查行代码参数:
if (e.Args.Length == 0 || e.Args.Any("-show".Contains))
{
//show interface...
}
我似乎无法理解"-show".Contains
的工作原理。
如果与(经典)x => x.Contains('"-show")
有任何区别(除了明显的打字增益)。
像魅力一样工作,但我想明白为什么,我觉得有些大事是hapening。
答案 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=>
.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
的函数。不需要包装器。