我找到了一个示例代码,其中lambda使用如下代码
var sumOfgreaterThanSeven = numbers.Sum(n => n > 7 ? n : 0);
但上面的代码可以写成
var sumOfgreaterThanSeven = numbers.Sum(n > 7 ? n : 0);
所以为什么用户写lambda。请帮助我理解为什么用户在这里写lambda。 还告诉我lambda的优点是什么。感谢
答案 0 :(得分:12)
lambda是因为你想要评估条件表达式每个项目n
。您添加的版本(Sum(n > 7 ? n : 0)
)无效 - n
未在任何地方定义(编译器消息应为“名称'n'在当前上下文中不存在”)。
lambda可以理解为:
如果
n
,则n
大于7
返回n
< / em>,否则返回0
然后总结那个逻辑。
重新优势 - 首先是方便 - 还有组合。例如,使用LINQ-to-SQL,我绝对希望能够发布类似:
的内容 select sum(case when row.col > 7 then row.col else 0 end)
from sometable row
当然,使用它可能更好:
var sumOfgreaterThanSeven = numbers.Where(n => n > 7).Sum();
将映射到
select sum(row.col)
from sometable row
where row.col > 7
可能更准确地命中索引
答案 1 :(得分:2)
编写lambda时,您正在调用方法或计算表达式。 =&gt;的左侧是一组传递到右侧方法/表达式的参数。
IEnumerableThing.Where(a => DoSomeStuff(a))
就像写这个:
foreach (var a in IEnumerableThing)
{
DoSomeStuff(a);
}
对于Sum()
方法,您实际上是这样做的:
int mysum = 0;
foreach (var n in whatever)
{
if (n > 7) { mysum += n; }
}
答案 2 :(得分:2)
您需要将Lambda表达式视为方法。
n => n > 7 ? n : 0
实际上可以写成
(n) => {
if(n > 7)
return n;
else
return 0;
}
Lambda表达式将转换为匿名方法,并且将从中创建 Func<>
的实例。
正如Marc所指出的,这种转换为匿名方法和Func<>
或Action
的实例并不总是会发生 - 正如在Linq-to-sql中正确指出的那样。 ...... - 但这里确实如此,因此我指出了基础。