2
private void MainForm_Load(object sender, EventArgs e)
{
     Func<int, bool> f = funn;
     var list = new List<int>();
     list.Add(32);
     list.Add(1);
     list.Add(2);
     list.Add(3);
     MessageBox.Show(list.Where(f).First().ToString());//I give only f
}
private bool funn(int k)
{
        return k == 12;
}

请参阅Where子句参数

private void MainForm_Load(object sender, EventArgs e)
{
     Func<int, bool> f = funn;
     var list = new List<int>();
     list.Add(32);
     list.Add(1);
     list.Add(2);
     list.Add(3);
     MessageBox.Show(list.Where(i=>f(i)).First().ToString());//Now I give f with i
}
private bool funn(int k)
{
        return k == 12;
}

那么,那些调用过滤器方法的国王有什么区别呢?

4

1 回答 1

2

该特定示例没有语义差异,因为:

Where(method)

将期望method有一个签名bool method(T object),其中T是可枚举的类型,它只会调用method()序列中的每个对象。

Where( item => method(item) )

做完全相同的事情,因为它将序列中的每个对象传递给method().

但是,如果您需要(例如)使用其中的某些属性item来进行测试,则必须使用显式 lambda。

例如,想象如果item有一个Text你想传递给method()你的属性,你必须这样做:

Where( item => method(item.Text) )

在这种情况下,method()会有签名bool method(string)

更多细节

您可以只使用方法的名称而不是 lambda 委托的原因是因为“方法组转换”。

这在 C# 语言规范的第 6.6 节中有详细介绍。简单来说,它的意思是,如果一个方法与委托具有相同的签名,它可以自动转换为这样的委托类型。

从规范:

从方法组(第 7.1 节)到兼容委托类型存在隐式转换(第 6.1 节)。给定一个委托类型 D 和一个被归类为方法组的表达式 E,如果 E 包含至少一个适用于其正常形式(第 7.5.3.1 节)构造的参数列表的方法,则存在从 E 到 D 的隐式转换通过使用 D 的参数类型和修饰符,如下所述。

(然后它会更详细地进行,我不会在这里发布!)

于 2013-06-19T13:32:08.720 回答