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

string.Contains as a predicate not a function call?

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

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

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

很有魅力,但我想知道为什么,我觉得有大事要发生。

这个:

.Any("-show".Contains)

基本上是 shorthand 为此:

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

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

说第一个是 shorthand 第二个并不准确,因为方法组早于 Lambdas,但是如果您在调用 Any 等 LINQ 方法时考虑 Lambdas,那么它是实际上是这样。

等效项是 x => "-show".Contains(x) 而不是您所展示的内容。

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

正如@jmcilhiney 所说,shorthand 用于:

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

Contains 是一个接受 1 个字符串类型参数的函数(return 是布尔值)。 Any() 在这种情况下需要一个需要 1 个参数的函数,该参数是一个字符串,return 是一个布尔值。因此,与其添加额外的 lambda warapper s=>,不如直接 return .Contains

在技术术语中,这是一个:

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

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

的任何参数

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

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

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

String.Contains的签名是

bool Contains(string s)

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