Lambda其实就是匿名函数的缩写,它们实现的功能是一样的,不同的是,它们表达的方式不同,当然它是比匿名函数更简单的一种方法
public static IEnumerable<Product> Filter(this IEnumerable<Product> productEnum, Func<Product, bool> selectorParam) { foreach (Product prod in productEnum) { if (selectorParam(prod)) { yield return prod; } } } }
Fileter是对IEnumerable<Product>实现的一个扩展方法,并且这个扩展方法传入一个泛型委托Func<Product,bool> 这个泛型委托传入的是Product.其返回的值是一个Bool值,现在我们用匿名函数的方式来实现这个泛型委托
Func<Product, bool> fruitFilter = delegate(Product prod) { return prod.Category == "水果"; };
实例化一个IEnumerable来实现
IEnumerable<Product> filteredProducts = products.Filter(fruitFilter);
上面使用的是委托匿名函数的方式来实现了
接着我们使用Lambda表达式的方式来实现
Func<Product, bool> fruitFilter = prod => prod.Category == "水果"; IEnumerable<Product> filteredProducts = products.Filter(fruitFilter);
这样子是不是代码又简单很多了,而且这两段代码可以进一步简化
IEnumerable<Product> filteredProducts = products.Filter(prod => prod.Category == "水果");
Lambda表达式分为语句Lambda和表达式Lambda
语句Lambda 和 表达式Lambda 的区别在于,前者在 =>右边有一个语句块(大括号),而后者只有一个表达式(没有return 和大括号)。
(1)表达式Lambda:
list.FindAll(d => d.Id > 2);// goes to list.ForEach(d => Response.Write(d.ToString() + "<br/>"));
(2)语句Lambda:
list.ForEach(d => { if (d.Id > 2) { Response.Write(d.ToString() + "<br/>"); } });
上面我们实现自定义的查询方式是给IEnumerbale<Product>自定义了一个扩展方法Filter,而Linq中有很多扩展方法,这样就可以大大减少工作量
一个数据集合
Product[] products = { new Product {Name = "西瓜", Category = "水果", Price = 2.3M}, new Product {Name = "苹果", Category = "水果", Price = 4.9M}, new Product {Name = "空心菜", Category = "蔬菜", Price = 2.2M}, new Product {Name = "地瓜", Category = "蔬菜", Price = 1.9M} };
如果不使用Linq我们会写一个排序方法类实现prduct的价格从大到小的排序并且还要新建一个Product[]的数组来存放排序好后的数据
使用Linq
var results = from product in products orderby product.Price descending select new { product.Name, product.Price };
另一种
var results = products .OrderByDescending(e => e.Price) .Take(3) .Select(e => new { e.Name,e.Price});