C# 是否将包含作为谓词而不是函数调用?

C# 是否将包含作为谓词而不是函数调用?,c#,linq,predicate,C#,Linq,Predicate,我在上找到了此代码示例,因此(不记得从何处:/)允许我在启动应用程序时检查行代码参数: if (e.Args.Length == 0 || e.Args.Any("-show".Contains)) { //show interface... } 我似乎无法理解“-show.”包含的是如何工作的。 如果与(经典)x=>x.Contains(““-show”)有任何区别(除了明显的键入增益) 工作起来很有魅力,但我想知道为什么,我觉得有什么大事正在发生。这是: .Any("-show".Co

我在上找到了此代码示例,因此(不记得从何处:/)允许我在启动应用程序时检查行代码参数:

if (e.Args.Length == 0 || e.Args.Any("-show".Contains))
{
  //show interface...
}
我似乎无法理解
“-show.”包含的
是如何工作的。
如果与(经典)
x=>x.Contains(““-show”)
有任何区别(除了明显的键入增益)

工作起来很有魅力,但我想知道为什么,我觉得有什么大事正在发生。

这是:

.Any("-show".Contains)
基本上是这方面的简写:

.Any(s => "-show".Contains(s))
Any
方法将委托作为参数,您可以通过多种方式创建该委托。第一个代码段使用方法组,而第二个代码段使用Lambda


说第一种方法是第二种方法的简写并不准确,因为方法组早于Lambdas,但是如果您在调用诸如
Any
之类的LINQ方法时考虑Lambdas,那么事实就是如此。

等价物应该是
x=>“-show”。包含(x)
,而不是您所显示的内容


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

正如@jmcilliney所说,它是:

.Any(s => "-show".Contains(s))
Contains
是一个函数,它接受1个字符串类型的参数(并返回布尔值)
Any()
在本例中,需要一个需要1个参数的函数,该参数是一个字符串,返回一个布尔值。因此,您可以直接返回
。Contains

从技术角度来说,这是一个:

Func<string, boolean> //1 param string, output: boolean
需要一个
Func
委托。因此,可以应用任何返回
bool
并接受与集合元素类型相同的参数的函数(
string
)。这可以是现有函数,也可以是lambda表达式

String.Contains的签名是

bool Contains(string s)

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

注意,方法组仅在代理接收到最多一个参数时才起作用。当有更多的参数时,方法组就不能使用了。这不是一个简写,它正是委托所接受的。基本上,这是一个方法组的委托构造(因此没有括号)?我不太了解代理或方法组。是的,就是这样。这与在VB中使用
AddressOf
基本相同。@Phoque从概念上讲,它只是使用绑定方法(绑定方法只是附加到特定实例的实例方法,因此它内部的
this
的定义)作为对象并将其作为参数传递。lambda只是方法的内联定义。虽然我不会保证这反映了底层实现。属于
-show
-
foos
的任何参数都同时包含
o
s
,但它不会匹配任何(…)取参数
Func
和方法
包含(…)
完全满足该函数签名。将字符串作为参数并返回bool。因此,无需将Contains封装在匿名函数中。旁注:这是一种检查参数值的糟糕方法。是的,当我阅读答案时,我意识到这不是一个好的解决方案(并将其改回lambda表达式(x=>x=“-show”)。
bool Contains(string s)