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
参数并返回 bool
和wrapping 接受单个 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()
我在 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
参数并返回 bool
和wrapping 接受单个 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()