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;
}
那么,那些调用过滤方法之王有什么区别?
答案 0 :(得分:2)
该特定示例没有语义差异,因为:
Where(method)
希望method
有一个签名bool method(T object)
,其中T
是可枚举的类型,它只会为序列中的每个对象调用method()
。< / p>
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的参数类型和修饰符,如下所述。
(然后它继续更详细,我不会在这里发布!)