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)