将lambda表达式转换为匿名方法?

时间:2016-06-10 10:14:11

标签: c# lambda anonymous-methods

我很难理解lambda表达式。从我的理解,lambda表达式是一个方便的(较少的代码)是代表匿名方法。我理解匿名方法。在下面的代码示例中,如何将lambda表达式更改为匿名方法?

public class CustomersController : Controller {
    // GET: Customers
    public ViewResult Index() {
        var customers = GetCustomer();
        return View(customers);
    }
    public ActionResult Details(int id) {
        var customers = GetCustomer().SingleOrDefault(c => c.Id == id);   
        if (customers == null)
            return HttpNotFound();

        return View(customers);
    }
    private IEnumerable<Customers> GetCustomer() {
        return new List<Customers> {
            new Customers { Id = 1, Name="John Smith"},
            new Customers { Id = 2, Name = "Mary Smith"}   
        };   
    }    
}

2 个答案:

答案 0 :(得分:3)

从lambdas的语法桥接到匿名方法的语法的一种方法是将其从最简单的形式转换为更复杂的形式。因此,你的表达式将成为

var customers = GetCustomer().SingleOrDefault(c => {
    return c.Id == id;
});

现在主体由一个正确的语句组成,并且在一对花括号中,我们可以完成对匿名方法语法的转换:

var customers = GetCustomer().SingleOrDefault(delegate (Customer c) {
    return c.Id == id;
});

您可以看到lambda语法是一般匿名委托的简化,delegate (Customer c)缩减为c =>,带有推断类型,没有花括号,以及来自return的表达式作为正文的声明。

答案 1 :(得分:0)

var customers = GetCustomer().SingleOrDefault(c => c.Id == id);

让我们稍微突破一下这条线。 GetCustomer返回IEnumerable<Customer>,因此SingleOrDefault上会声明System.Linq.Enumerable

Func<Customer, bool> criteria = c => c.Id = id;
var customers = Enumerable.SingleOrDefault(GetCustomers(), criteria);

在此代码中,编译器将lambda表达式转换为匿名方法。 criteria是一个引用匿名方法的局部变量。

现在更改GetCustomers以返回IQueryable<Customer>,以便在SingleOrDefault上定义System.Linq.Queryable

Expression<Func<Customer, bool>> criteria = c => c.Id = id;
var customers = Queryable.SingleOrDefault(GetCustomers(), criteria);

在此代码中,编译器将lambda表达式转换为表达式树。 criteria是一个引用表达式树的局部变量。来自IQueryable<Customer>的{​​{1}}的实现可以将表达式树编译为本地执行的.net方法,或者它可以将表达式转换为SQL并将其发送到数据库或其他内容。这取决于GetCustomers的运行时实现。