【问题标题】:Why can I leave a parameter off a LINQ condition?为什么我可以在 LINQ 条件下保留一个参数?
【发布时间】:2014-08-08 23:36:15
【问题描述】:

我正在阅读this answer,了解如何在字符串中搜索数组中包含的任何字符串。解决方案非常简洁:

if(stringArray.Any(stringToCheck.Contains))

我的问题是,Contains() 术语为什么不需要显式参数?我会把上面写成:

if(stringArray.Any(s => stringToCheck.Contains(s)))

使用这个缩短版的规则是什么?

【问题讨论】:

  • 此外,我相信这在函数式编程中被称为无点风格 - 因为您不需要明确指定参数
  • 老实说,看起来不像重复,至少标记为这样的问题。方法组与此处发布的实际问题无关。
  • @Tigran 你读过这个问题吗?这与方法组有何关系?
  • @Selman22:是的,这就是为什么它不是重复的。它不是询问方法组描述,而是为什么提供的代码有效?它由于重载解决方案而起作用,但在我看来,OP 并没有意识到这一点。所以对此做出回应:阅读方法组,不是答案。
  • @Geoff:正确,对你有好处。但为了 this 帖子的正确性,它应该被正确回答,或者至少标记为重复 correct 问题已经被某人回答。

标签: c# linq


【解决方案1】:

Any 需要一个函数 (Func)(我假设 stringArray 只是一个字符串)

  1. 接受char 输入
  2. 返回bool。

最常用的方法是创建一个内联匿名函数(一个 lambda 表达式)。但是,您可以改为传递实际函数。系统将查看参数和返回类型以确保匹配,就像 lambda 语句一样。

恰好函数Contains 将char 作为输入并返回bool。这就是为什么您可以传递函数的名称而不是调用它(使用带有参数列表的括号)。

以我们自己的函数为例:

public static bool Contains2 (this string input, char c)
{
    //....
}

stringArray.Any(stringToCheck.Contains2)

这也符合要求。注意 Contains2 上没有 () 括号。这是因为我们正在传递 函数本身。

您的 lambda 也可以工作,因为它接受一个字符输入 (s =>) 并返回一个布尔值(Contains(s) 的结果)。

【讨论】:

  • 谢谢 - 对我来说真正的“啊哈”时刻是你关于传递函数本身的注释。
  • @Geoff,你知道,lambda 也是一样。您仍然只是传递了一个完整的函数,唯一的区别是您使函数体内联,而不是指向现有函数。
【解决方案2】:

因为这里使用了Any重载:

public static bool Any<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

在哪里

谓词是您的stringToCheck.Contains 方法。

【讨论】:

  • SO 是一个英文论坛...请发布英文链接。
  • @Tigran 标题具有误导性 - 但 OP 想知道的是 lambda 表达式 (s =&gt; stringToCheck.Contains(s)) 和方法组 (stringToCheck.Contains) 之间的区别。既然如此,这并不能回答问题。
  • @dcastro:“我的问题是,为什么 Contains() 项不需要显式参数?”在我看来,这个问题很明确。所以答案是:由于 Any 的重载,即使没有指定参数,您的代码也可以编译和工作,因为谓词可能以这种方式工作。
  • @Tigran 确切地说,他在问为什么 Contains 不需要显式参数。他不是在询问 Any 方法。你似乎很困惑。
【解决方案3】:

n这是一个方法组。只有一个参数,因此编译器可以确定可以传入什么。换句话说,stringToCheck.Contains 方法与Any 具有相同的签名。

【讨论】:

    【解决方案4】:

    因为Any 方法需要Delegate Func&lt;TSource, bool&gt;,如果Contains 方法满足它,我们可以发送方法本身,而不是创建新的匿名方法,这将只是包装stringToCheck.Contains(s)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多