2016-06-10 41 views
0

我很難理解lambda表達式。根據我的理解,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"} 
     }; 
    }  
} 
+0

Lambda表達式可以轉換爲[表達式樹](https://msdn.microsoft.com/en-us/library/mt654263.aspx),而匿名方法則不能。因此,當處理需要表達樹的框架/庫時,例如實體框架,你必須使用lambda表達式。 –

回答

3

從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 =>,推斷類型,沒有大括號,以及return語句的表達式作爲正文。

0
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>,使SingleOrDefaultSystem.Linq.Queryable定義。

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

在此代碼中,編譯器將lambda表達式轉換爲表達式樹。 criteria是引用表達式樹的局部變量。從GetCustomers開始的IQueryable<Customer>的實現可以將表達式樹編譯成本地執行的.net方法,或者它可以將表達式轉換成SQL並將其發送到數據庫或其他東西。這取決於IQueryable<Customer>的運行時實現。