快速业务通道

LINQ学习笔记:Lambda表达式

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-13
是一个callback, 我们可以在其中放入我们自己的逻辑, 这令查询操作非常的强大, 并且简单. 我们可以看一下Enumerable.Where的实现, 忽略异常处理:

   1: public static IEnumerable<TSource> Where<TSource> (
   2:   this IEnumerable<TSource> source,
   3:   Func<TSource,bool> predicate)
   4: {
   5:   foreach (TSource element in source)
   6:     if (predicate (element))
   7:       yield return element;
   8: }

2.1 Lambda表达式和Func标记

在标准的查询操作符中利用了范型Func代理, 它们存在于System.Linq中, 并且定义如下

Func中出现的参数顺序类型跟Lambda表达式中出现的一致. 因此, Func<TSource,bool>匹配一个TSource => bool的Lambda表达式, 它接受一个TSource类型的参数并且返回一个布尔值. 类似的, Func<TSource, TResult>匹配一个TSource => TResult的Lambda表达式. 以下是所有的Func代理定义(注意返回值的类型总是最后一个参数的类型):

delegate TResult Func <T> ( );

delegate TResult Func <T, TResult> (T arg1);

delegate TResult Func <T1, T2, TResult> (T1 arg1, T2 arg2);

delegate TResult Func <T1, T2, T3, TResult> (T1 arg1, T2 arg2, T3 arg3);

delegate TResult Func <T1, T2, T3, T4, TResult> (T1 arg1, T2 arg2, T3 arg3, T4 arg4);

2.2 Lambda表达式和元素命名

标准的查询操作使用以下的类型命名:

TSource: 输入序列中的元素类型

TResult: 输出序列中的元素类型 – 如果它是不同于TSource的话

TKey: 用于sorting, grouping, join中的key类型

TSource是由输入序列决定的, 而TResult和Tkey则由Lambda表示式来推断. 例如, 考虑以下的Select操作:

   1: static IEnumerable<TResult> Select<TSource,TResult> (
   2:   this IEnumerable<TSource> source,
   3:   Func<TSource,TResult> selector)

Func<TSource,TResult>匹配一个TSource=>TResult的Lambda表达式, 一个对应于输入元素, 另一个则对应于输出元素. TSource和TResult是不同的类型, 因此Lambda表达式可以更改每一个元素的类型. 更进一步, Lambda表达式决定了输出序列的类型. 例如:

   1: string[] names = { "James","Jack","Harris"};
   2: IEnumerable<int> query = names.Select (n => n.Length);
   3: foreach (int length in query)
   4:     Console.Write (length);       // 546

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号