在 Linq 方法中使用对象/方法名称? [复制]

Posted

技术标签:

【中文标题】在 Linq 方法中使用对象/方法名称? [复制]【英文标题】:Using object/method name inside Linq method? [duplicate] 【发布时间】:2019-08-18 05:37:00 【问题描述】:

第 3 行调用 Contains 但没有括号的“构造”的名称是什么?它是某种语法糖吗?

string current = "02";
string[] list = "00", "01", "02", "03", "10";
if (list.Any(current.Contains)) 
  // logic

我只是不知道它为什么和如何工作,也不知道它叫什么?

【问题讨论】:

是方法组。它不会被调用,而是转换为兼容的委托类型。 github.com/dotnet/csharplang/blob/master/spec/… 你没有打电话给current.Contains。您正在传递对current.Contains 的引用。然后,通过该引用,它被list.Any() 调用——或者可能通过list.Any() 传递给它的其他方法。编写自己的 List.Any() 等价物是一个非常有用的练习。 没有括号,因为您没有执行包含,而是将方法引用“传递”给 Any-function。 【参考方案1】:

list.Any() 函数将谓词函数作为第一个参数。通常这是一个内联 lambda 函数,如 list.Any(s => s == "01"),但当然,您可以传入一个正确定义的函数,如您的示例中。

s => s == "01"current.Contains 具有相同的签名。它们都将字符串作为唯一的输入参数并返回一个布尔值。因此,它们都可以用作list.Any() 函数中的谓词。

有关方法组的更多信息,请查看THIS LINK 和有关 Lambda 函数的信息see here

【讨论】:

【参考方案2】:

您可能记得您可以通过以下方式订阅事件:

something.SomeEvent += SomeHandler;

这是语法糖:

something.SomeEvent += new EventHandler(SomeHandler);

这会创建一个新的EventHandler 实例(EventHandler 是一个委托类型),它使用方法SomeHandler

这里正在发生类似的事情。

list.Any 采用 Func<T, bool>,这是一个委托类型。因此,您需要将Func<T, bool> 的实例传递给它。

当你写作时:

list.Any(x => current.Contains(x))

编译器创建一个新方法(接受string,返回bool,然后调用current.Contains),然后执行如下操作:

list.Any(new Func<string, bool>(GeneratedMethod))

现在,您还可以自己从显式方法创建 Func&lt;string, bool&gt; 委托实例,就像在 EventHandler 示例中一样:

list.Any(new Func<string, bool>(current.Contains))

或者,您可以省略new Func&lt;string, bool&gt;,编译器会为您生成它,就像前面的示例一样:

list.Any(current.Contains)

【讨论】:

以上是关于在 Linq 方法中使用对象/方法名称? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

现有的类似于 Parallel.For 的 LINQ 扩展方法? [复制]

如何获取对象名称? [复制]

有没有更快的方法来检查 LINQ to XML 中的 XML 元素?

如果我只知道 python 中的绑定方法,如何获取类的名称? [复制]

如何将 linq var 数据类型传递给方法? [复制]

LINQ学习