LINQ学习笔记:Lambda表达式
是一个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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |