.NET 自定义linq的where扩展方法及其原理

在开发中,如果有特殊需求,我们可以自定义.NET中方法的扩展方法,小编遇到一个情况,在一个老的项目中不能引用linq,但是我们需要用到Lambda表达式中的方法,那么我们就需要自定义扩展方法;还有一种情况是我们只用到Lambda很少的一部分功能那么也可以自定义扩展方法,比如where方法。 下面以where为例我们具体来看看怎么自定义,顺便看看他们的原理。.

一、数据准备

我们准备一个类并且模拟数据

 //这里是客户类 public class Customer    {        public int id { get; set; }        public string name { get; set; }        public string email { get; set; }        public int age { get; set; }    }    //并赋值     public static List<Customer> GetCustomer()        {            List<Customer> list = new List<Customer>();            list.Add(new Customer { id = 1, name = "刘德华", age = 56, email = "ldh@net.cn" });            list.Add(new Customer { id = 2, name = "张学友", age = 52, email = "zxy@net.cn" });            list.Add(new Customer { id = 3, name = "黎明", age = 58, email = "lm@net.cn" });            list.Add(new Customer { id = 4, name = "郭富城", age = 60, email = "gfc@net.cn" });            list.Add(new Customer { id = 5, name = "古天乐", age = 55, email = "gtl@net.cn" });            return list;        }
二、编写扩展方法
这里我们查询年龄大于55岁的明星,通常不用linq需要遍历这个List,并且新建一个List来保存遍历的结果,代码如下:
List<Customer> list = new List<Customer>();foreach (var item in GetCustomer()) {      if(item.age>55)      {          list.Add(item);      }}
假如我们查询Id大于3呢,岂不是又得写个循环,非常的麻烦。于是乎我们拿扩展方法来解决代码重用的问题。那么问题又来了,条件参数怎么传入呢?.NET强大的委托替我们解决了。
怎么编写扩展方法,很简单,只需要了解扩展方法三要素就可以了。如下:
1)扩展方法所在类是静态类,2)扩展方法为静态方法,3)第一个参数使用this关键字指向扩展类。
扩展方法具体代码如下:
public static class Self{         public static IEnumerable<T> SelfWhere<T>(this IEnumerable<T> lists, Func<T, bool> func)        {            foreach (var t in lists)            {                if (func.Invoke(t))                {                                 yield return t;//yield关键字遍历一次返回一次                }            }        }    }

三、调用扩展方法

调用扩展方法跟调用原生where方法一样,如下

 static void  Main(string[] args)  {    //这个是调用扩展方法    var cuList= GetCustomer().SelfWhere(w => w.age > 55);    //原生的where方法    var cuList3 = GetCustomer().Where(w => w.age > 55);    foreach (var item in test)    {        Console.WriteLine(item.name);    }  }  //都输出:刘德华,黎明,郭富城

这里我们用反编译三个方法的调用,如下:

.NET 自定义linq的where扩展方法及其原理

从上可以看出,原生的where调用的也是委托Func,几乎跟我们写的一样。原理其实就是委托。

结语

本文讲述了where扩展方法的使用,以及它的基本原理。其他的方法大家也可以尝试尝试扩展方法。写作水平有限,希望本文对大家学习和工作有一定参考价值,谢谢大家的支持。