将lambda表达式转换为匿名方法?
问题描述:
我很难理解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"}
};
}
}
答
从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
语句的表达式作为正文。
答
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>
,使SingleOrDefault
上System.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>
的运行时实现。
Lambda表达式可以转换为[表达式树](https://msdn.microsoft.com/en-us/library/mt654263.aspx),而匿名方法则不能。因此,当处理需要表达树的框架/库时,例如实体框架,你必须使用lambda表达式。 –