《ASP.NET 4.0从入门到精通》第3章C# 4.0语言特色,本章讨论在C# 4.0语言中许多增强的功能。首先介绍隐式类型声明,由编译器根据上下文进行类型推断,接下来讨论使用自动属性功能简化编写重复性的属性代码。对象初始化器可以简化开发人员的赋值代码,接下来讨论如何对一个现有类进行扩展的扩展方法。本节为大家介绍Lambda表达式。
3.7 Lambda表达式
在C# 2.0中,引入了一个匿名方法的特性,使开发人员可以直接为委托添加方法语句块,而不需要显式地创建一个单独的方法。在C# 4.0中,提供了一个更加简法的方法来处理.NET中的委托类型,即Lambda表达式。
3.7.1 理解Lambda表达式(1)
【范例3.21】为了更好地讲述Lambda表达式以便于理解,在本小节同样先创建一个控制台应用程序,命名为LambdaDemo。在本示例中,首先举一个匿名方法的例子,然后看看Lambda表达式是如何声明并简化匿名方法的代码的。
首先举一个传统的使用委托的例子。在泛型List中,有一个重载的FindAll方法,该方法的一个重载版本接受一个谓词委托,也就是一个用一个委托作为参数,开发人员需要创建一个单独的方法来传递给FindAll方法,以便对List中的每个项进行判断。示例代码如下所示:
- 01 using System;
- 02 using System.Collections.Generic;
- 03 using System.Linq;
- 04 using System.Text;
- 05 namespace LambdaDemo
- 06 {
- 07 class Program
- 08 {
- 09 static void Main(string[] args)
- 10 {
- 11 Console.WriteLine("传统的委托代码示例, 运行结果为:");
- 12 FindListDelegate();
- 13 }
- 14 //传统的调用委托的示例
- 15 static void FindListDelegate()
- 16 {
- 17 //先创建一个泛型的List类
- 18 List<string> list = new List<string>();
- 19 list.AddRange(new string[] {"语言书",
"软件书","政治","图书","开发人员"});- 20 Predicate<string> findPredicate = new
Predicate<string>(IsBookCategory);- 21 List<string> bookCategory = list.
FindAll(findPredicate);- 22 foreach (string str in bookCategory)
- 23 {
- 24 Console.WriteLine("{0}\t", str);
- 25 }
- 26 }
- 27 //谓词方法, 这个方法将被传递给FindAll方法进行书籍分类的判断
- 28 static bool IsBookCategory(string str)
- 29 {
- 30 return str.EndsWith("书") ? true : false;
- 31 }
- 32 }
- 33 }
【代码解析】在这段代码中,为Predicate<string>委托创建了一个单独的方法IsBookCategory,这个方法判断字符串中是否以“书”这个字符结尾,如果是,则表示符合查询的要求,否则将进行排除。这段代码的运行效果如图3.18所示。
![]() |
(点击查看大图)图3.18 传统的委托方法的运行示例 |
- //使用匿名方法来进行搜索过程
- static void FindListAnonymousMethod()
- {
- //先创建一个泛型的List类
- List<string> list = new List<string>();
- list.AddRange(new string[] {"语言书", "软件书", "政治", "图书", "开发人员" });
- //在这里, 使用匿名方法直接为委托创建一个代码块, 而不用去创建单独的方法
- List<string> bookCategory = list.FindAll
- (delegate(string str)
- {
- return str.EndsWith("书") ? true : false;
- }
- );
- foreach (string str in bookCategory)
- {
- Console.WriteLine("{0}\t", str);
- }
- }
联系客服