一、Linq
下面我们来看个示例,自定义一个Linq,实现Where条件筛选
using System; using System.Collections.Generic; namespace MyLinqAttribute { /// <summary> /// 含有yield的函数说明它是一个生成器,而不是普通的函数。 /// 当程序运行到yield这一行时,该函数会返回值,并保存当前域的所有变量状态; /// 等到该函数下一次被调用时,会从上一次中断的地方开始执行,一直遇到下一个yield, 程序返回值, 并在此保存当前状态;如此反复,直到函数正常执行完成。 /// /// 迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,它是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式。 /// 简单来说,迭代器模式使得你能够获取到序列中的所有元素,而不用关心其类型是array,list,linked list或者是其他什么序列结构。 /// 这一点使得能够非常高效的构建数据处理通道(data pipeline),即数据能够进入处理通道,进行一系列的变换,或者过滤,然后得到结果。事实上,这正是Linq的核心模式。 /// 在.NET中,迭代器模式被IEnumerator和IEnumerable及其对应的泛型接口所封装。如果一个类实现了IEnumerable接 口,那么就能够被迭代; /// 调用GetEnumerator方法将返回IEnumerator接口的实现,它就是迭代器本身。迭代器类似数据库中的游标,它是数据序列中的一个位置记录。 /// 迭代器只能向前移动,同一数据序列中可以有多个迭代器同时对数据进行操作。 /// </summary> public static class ExtendMethod { /// <summary> /// Linq是基于委托的封装,实现逻辑解耦、代码重用 /// 1、把重复的代码写在这里,把变化的部分通过委托传递 /// 2、泛型完成对不同类型的数据过滤 /// 3、迭代器模式,完成了数据的按需获取,延迟加载 /// </summary> public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> resource, Func<T, bool> func) { foreach (var item in resource) { Console.WriteLine("进入数据检测"); //写好公共逻辑 if (func.Invoke(item)) //可变部分交给委托实现逻辑解耦 { yield return item;//yield跟IEnumerable配对使用(迭代器模式) } } } } }