C# Lambda表达式

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 和 表达式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/>"); } });

Linq

上面我们实现自定义的查询方式是给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});
原文地址:https://www.cnblogs.com/ilooking/p/4137447.html