为什么lambda在代码中?

时间:2011-02-23 09:34:39

标签: c# lambda

我找到了一个示例代码,其中lambda使用如下代码

var sumOfgreaterThanSeven = numbers.Sum(n => n > 7 ? n : 0);

但上面的代码可以写成

var sumOfgreaterThanSeven = numbers.Sum(n > 7 ? n : 0);

所以为什么用户写lambda。请帮助我理解为什么用户在这里写lambda。 还告诉我lambda的优点是什么。感谢

3 个答案:

答案 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中正确指出的那样。 ...... - 但这里确实如此,因此我指出了基础。