在Linq方法中使用对象/方法名称?

时间:2019-03-27 15:23:54

标签: c#

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

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

我只是无法弄清楚它为什么起作用,如何工作,又叫什么名字?

2 个答案:

答案 0 :(得分:2)

list.Any()函数将谓词函数用作第一个参数。通常,这是list.Any(s => s == "01")之类的内联lambda函数,但是由于这个原因,您可以像示例中那样传入正确定义的函数。

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

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

答案 1 :(得分:2)

您可能还记得您可以通过以下方式订阅活动:

top

这是语法糖:

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>