【问题标题】:Convert lambda expression to anonymous method?将 lambda 表达式转换为匿名方法?
【发布时间】:2016-10-11 06:25:11
【问题描述】:

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

【问题讨论】:

  • Lambda 表达式可以转换为expression trees,而匿名方法则不能。因此,在处理需要表达式树的框架/库时,例如实体框架,你必须使用 lambda 表达式。

标签: c# lambda anonymous-methods


【解决方案1】:

将 lambda 语法转换为匿名方法语法的一种方法是将其从最简单的形式转换为更复杂的形式。因此,你的表情会变成

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 =&gt;,具有推断类型,没有花括号,return 语句中的表达式用作主体。

【讨论】:

    【解决方案2】:
    var customers = GetCustomer().SingleOrDefault(c => c.Id == id);
    

    让我们稍微打破这条线。 GetCustomer 返回一个IEnumerable&lt;Customer&gt;,因此SingleOrDefaultSystem.Linq.Enumerable 上声明。

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

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


    现在将 GetCustomers 更改为返回 IQueryable&lt;Customer&gt;,以便在 System.Linq.Queryable 上定义 SingleOrDefault

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 2011-09-22
      • 1970-01-01
      • 2013-07-16
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多