|
回顾:
前面我们说过LINQ查询表达式只能操作实现了IEnumerable<T>接口的对象。 再来看前面几个例子,我们通过数组来使用了LINQ查询表达式,那是否Array实现了IEnumerable<T>接口了? 可以看到正式的Array定义如下: //Array类型看上去并没有实现查询表达式所需要的接口 public abstract class Array:ICloneable,IList,ICollection,IEnumerable {....} 然而你通过数组的实例来点 可以点出很多原本在Array里并没有提供的方法。 想想你可能马上就想到了扩展方法,对,是其他类型在幕后对Array类型做了扩展,所以我们才可以得到那些功能. 目标: 1.Linq查询表达式内部实现机制 2.Linq查询运算符的演变过程 使用LINQ查询非泛型的集合 System.Enumerable类型提供很多对IEnumerable接口的扩展方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace ConsoleApplication4![]() ![]() { class Test1![]() { static void Main()![]() { ArrayList list = new ArrayList(); list.Add("Asp.net"); list.Add(111); list.Add("Ajax"); //通过扩展方法OfType<T>把ArrayList转换成了一个兼容于IEnumber<T>的类型 IEnumerable<string> myList=list.OfType<string>(); var item = from g in myList where g.Length > 5 orderby g select g;![]() Array.ForEach<string>(item.ToArray<string>(), s => { Console.WriteLine(s); }); } } } //注意非泛型类型可以包含任何类型的项,以ArrayList为例,它接受的是Object类型的项 //使用OfType<T>可以过滤出类型不满足T的类型的项 namespace System.Linq![]() ![]() { //这个类型扩展了很多早先2.0里类型没有的方法 这些都是底层的实现 public static class Enumerable![]() { //扩展了IEnumerable接口,相当于在IEnumerable接口里添加了一个OfType<Tresult>的泛型方法 public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source)![]() { if (source == null)![]() { throw Error.ArgumentNull("source"); } return OfTypeIterator<TResult>(source); } //扩展了IEnumerable<T>接口 其接受一个参数并返回一个bool类型的委托 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)![]() { if (source == null)![]() { throw Error.ArgumentNull("source"); } if (predicate == null)![]() { throw Error.ArgumentNull("predicate"); } return WhereIterator<TSource>(source, predicate); } } }![]() 二、Linq查询运算符的演变过程
|





}
}
浙公网安备 33010602011771号