回顾:
前面我们说过LINQ查询表达式只能操作实现了IEnumerable<T>接口的对象。
再来看前面几个例子,我们通过数组来使用了LINQ查询表达式,那是否Array实现了IEnumerable<T>接口了?
可以看到正式的Array定义如下:
//Array类型看上去并没有实现查询表达式所需要的接口
public abstract class Array:ICloneable,IList,ICollection,IEnumerable
{....}
然而你通过数组的实例来点 可以点出很多原本在Array里并没有提供的方法。
想想你可能马上就想到了扩展方法,对,是其他类型在幕后对Array类型做了扩展,所以我们才可以得到那些功能.
目标:
1.Linq查询表达式内部实现机制
2.Linq查询运算符的演变过程
一、LINQ查询表达式内部实现机制: LINQ可以操作数组类型,也可以操作System.Collections.Generic命名空间的成员类型如:List<T> 使用LINQ查询非泛型的集合 System.Enumerable类型提供很多对IEnumerable接口的扩展方法
二、Linq查询运算符的演变过程
![]()
总结: 查询表达式是用各种查询运算符建立的 查询运算符只是调用了由System.linq命名空间下的Enumerable定义的扩展方法的简化符号 Enumerable的许多方法都要求代理(特别是Func<>)作为参数
在C#3.0 任何要求代理参数的方法都可以传入一个Lambda表达式
Lambda是伪造的匿名方法
匿名方法是对指派一个原始代理然后手工建立一个代理目标方法的简化符号.
|