繁体   English   中英

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

[英]Convert lambda expression to anonymous method?

我很难理解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"}   
        };   
    }    
}

从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语句的表达式用作主体。

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

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

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

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


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM