在 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<string, bool>
委托实例,就像在 EventHandler
示例中一样:
list.Any(new Func<string, bool>(current.Contains))
或者,您可以省略new Func<string, bool>
,编译器会为您生成它,就像前面的示例一样:
list.Any(current.Contains)
【讨论】:
以上是关于在 Linq 方法中使用对象/方法名称? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
现有的类似于 Parallel.For 的 LINQ 扩展方法? [复制]
有没有更快的方法来检查 LINQ to XML 中的 XML 元素?