WEB开发网
开发学院软件开发C语言 C#3.0语言新特性之Lambda表达式 阅读

C#3.0语言新特性之Lambda表达式

 2009-03-12 08:19:19 来源:WEB开发网   
核心提示: 假设使用using语句导入了System.Query命名空间,并且定义了一个Customer类,C#3.0语言新特性之Lambda表达式(7),具有一个类型为string的属性Name,Select方法可以用于从一个Customer列表中选择名字:List<Customer>

假设使用using语句导入了System.Query命名空间,并且定义了一个Customer类,具有一个类型为string的属性Name,Select方法可以用于从一个Customer列表中选择名字:

List<Customer> customers = GetCustomerList();

 IEnumerable<string> names = customers.Select(c => c.Name);

对扩展方法Select的调用将被处理为一个静态方法调用:

IEnumerable<string> names = Sequence.Select(customers, c => c.Name);

由于没有显式地指定类型参数,将通过类型推断来推导类型参数。首先,customers参数被关联到source参数,T被推断为Customer。然后运用上面提到的拉姆达表达式类型推断过程,C的类型是Customer,表达式c.Name将被关联到selector参数的返回值类型,因此推断S是string。因此,这个调用等价于:

Sequence.Select<Customer, string>(customers, (Customer c) => c.Name);

并且其返回值类型为IEnumerable<string>。

下面的例子演示了Lambda表达式的类型推断是如何允许类型信息在一个范型方法调用的参数之间“流动”的。对于给定的方法:

static Z F<X, Y, Z>(X value, Func<X, Y> f1, Func<Y, Z> f2) { return f2(f1(value)); }

现在我们来写这样一个调用,来看看它的推断过程:

double seconds = F("1:15:30", s => TimeSpan.Parse(s), t => TotalSeconds);

类型推断过程是这样的:首先,参数"1:15:30"被关联到value参数,推断X为string。然后,第一个Lambda表达式的参数s具有推断出来的类型string,表达式TimeSpan.Parse(s)被关联到f1的返回值类型,推断Y是System.TimeSpan。最后,第二个Lambda表达式的参数t具有推断出来的类型System.TimeSpan,并且表达式t.TotalSeconds被关联到f2的返回值类型,推断Z为double。因此这个调用的结果类型是double。

上一页  2 3 4 5 6 7 8  下一页

Tags:语言 特性 Lambda

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接