Lambda表达式理解【匿名方法】
来源:互联网 发布:魔兽世界7.0 数据库 编辑:程序博客网 时间:2024/05/16 09:54
5.Lambda 表达式
Lambda 表达式和匿名函数其实是一件事情。不同是,他们语法表现形式不同,Lambda 表达式在语法上实际上就是匿名函数的简写。直接介绍匿名函数和Lambda表达式的用法没什么意思,在这里,我要根据实际应用来讲一个两者用法的例子,这样在介绍知识点的同时也能和大家分享一下解决问题的思想。
假如我们要实现一个功能强大的商品查询方法,这个商品查询方法如何查询商品是可以由用户自己来决定的,用户可以根据价格来查询商品,也可以根据分类来查询商品等等,也就是说用户可以把自己的查询逻辑传递给这个查询方法。要编写这样一个方法,我们很自然的会想到用一个委托来作为这个方法的参数,这个委托就是用户处理商品查询的逻辑。 我们不防把这个查询方法称为“商品查询器”。我们可以用静态的扩展方法来实现这个“商品查询器“,这样每个商品集合对象(如 IEnumerable<Product> products)可以直接调用该静态方法返回查询结果。解决问题的思想有了,接下来就是实现了。或许你对这一段描述有点蒙,结合代码可能让你更清晰。下面是这个“商品查询器”-Filter方法的实现代码:
/// <summary>/// 定义一个静态类,用于实现扩展方法/// </summary>public static class MyExtensionMethods { /// <summary> /// 商品查询器 /// </summary> /// <param name="productEnum">扩展类型的实例引用</param> /// <param name="selectorParam">一个参数类型为Product,返回值为bool的委托</param> /// <returns>查询结果</returns> public static IEnumerable<Product> Filter(this IEnumerable<Product> productEnum, Func<Product, bool> selectorParam) { foreach (Product prod in productEnum) { if (selectorParam(prod)) { yield return prod; } } }}
没错,我们就是用这么简短的Filter方法来满足各种需求的查询。上面Product类使用的是前文定义的。这里也再一次见证了扩展方法的功效。为了演示Filter查询方法的调用,我们先来造一批数据:
static void Main(string[] args) { // 创建商品集合 IEnumerable<Product> products = new ShoppingCart { Products = new List<Product> { new Product {Name = "西瓜", Category = "水果", Price = 2.3M}, new Product {Name = "苹果", Category = "水果", Price = 4.9M}, new Product {Name = "ASP.NET MCV 入门", Category = "书籍", Price = 19.5M}, new Product {Name = "ASP.NET MCV 提高", Category = "书籍", Price = 34.9M} } };}
接下来我们继续在上面Main方法中来调用查询方法Filter:
//用匿名函数定义一个具体的查询需求Func<Product, bool> fruitFilter = delegate(Product prod) { return prod.Category == "水果";};//调用Filter,查询分类为“水果”的商品IEnumerable<Product> filteredProducts = products.Filter(fruitFilter);//打印结果foreach (Product prod in filteredProducts) { Console.WriteLine("商品名称: {0}, 单价: {1:c}", prod.Name, prod.Price);} Console.ReadKey();
输出结果为:
上面我们使用的是委托和匿名函数来处理用户查询逻辑,并把它传递给Filter方法,满足了前面所说的需求。但若使用Lambda表达式代替上面的匿名函数能使上面的代码看上去更简洁更人性化,如下代码所示:
Func<Product, bool> fruitFilter = prod => prod.Category == "水果";IEnumerable<Product> filteredProducts = products.Filter(fruitFilter);
没有了delegate关键字,没有了大小括号,看上去更舒服。当然上面两行代码可以继续简化为一行:
IEnumerable<Product> filteredProducts = products.Filter(prod => prod.Category == "水果");
这三种方式输出结果都是一样的。然后,我们还可以通过Lambda表达式实现各种需求的查询:
//查询分类为“水果”或者单价大于30元的商品IEnumerable<Product> filteredProducts = products.Filter(prod => prod.Category == "水果" || prod.Price > 30);
通过这个示例,相信大家已经清晰的了解并撑握了Lambda表达式的简单应用,而这就足够了:)。
- Lambda表达式理解【匿名方法】
- 匿名方法、Lambda表达式
- 匿名方法 Lambda表达式
- 匿名方法和Lambda表达式
- 匿名方法与lambda表达式
- 匿名方法与lambda表达式
- 匿名方法 VS Lambda表达式
- 匿名方法和Lambda表达式
- 匿名方法 与 Lambda 表达式
- 匿名方法和lambda表达式
- 委托,匿名方法,lambda表达式
- 匿名方法(暨 lambda 表达式)使用指南
- 匿名函数、委托、lambda表达式、扩展方法
- c#之委托、匿名方法、Lambda表达式
- C# 匿名方法和Lambda表达式
- 委托和匿名方法、lambda表达式
- .NET中的Lambda表达式与匿名方法
- 委托、匿名方法、Lambda表达式的演进
- VS中的解决方案设置--项目属性
- Java泛型
- hdoj 2042 不容易系列之二 C++
- js基本属性介绍
- Codeforces#304-D - Soldier and Number Game-求因子个数/数学
- Lambda表达式理解【匿名方法】
- Adapter模式
- 学习资源搜集
- javascript 变量的作用范围
- 动态代理模式
- 黑马程序员——C语言学习笔记06 结构体
- Android设备相关
- ETC1压缩纹理格式详解
- 蓝的成长记——追逐DBA(20):何故缘起,建库护航 (二次发布-练习使用markdown编辑)