从Linq的Where方法理解泛型、委托应用场景
最近遇到了一个问题,Linq的Where里面传递的是什么?Where的功能是什么实现的?没有第一时间答上来,在整理相关资料后决定自行实现Linq的Where方法来加深印象。
什么是泛型
指在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象)再进行类型的定义,通过泛型的使用大大的提高的代码的重复使用率
关于Linq
对于Linq可以理解为一种查询方式,允许我们通过查询数据库的方式来查询数据的集合,但是对于EF框架Linq所生成的是SQL语句,但是对于继承于IEnumerable
关于委托
委托是一个类,定义了方法的类型,可以把方法作为参数来传递;提到委托就不得不提到事件,事件一般被概括为特殊的委托,和委托不同之处在于对象可以通过事件像其他对象通知发生的相关事情,事件实现了订阅和发布的功能,可以简单的理解为类似于前端OnClick(),当某件事发生的时候触发,这里不再过多赘述
自定义实现Linq的Where方法
因为Linq的where传入的具体类型是不确定的,所以这里定义方法要使用泛型。作为Where参数传入的是筛选器,我们需要实现的是满足调整的对象则返回,否则跳过,所以这里使用内置委托方法Func<in T, out TResult>,
这个委托封装了一个方法,该方法具有一个参数,且返回由 TResult 参数指定的类型的值,T:为此委托封装的方法的参数类型。TResult:此委托封装的方法的返回值类型。
static void Main(string[] args)
{
List<int> artys = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
MyWhere(artys, x => x > 5);
Console.ReadKey();
}
internal static IEnumerable<T> MyWhere<T>(IEnumerable<T> source, Func<T, bool> f)
{
List<T> res = new List<T>();
foreach (var item in source)
{
if (f(item))
{
res.Add(item);
}
}
return res;
}
internal static IEnumerable<T> MyWhereYield<T>(IEnumerable<T> source, Func<T, bool> f)
{
foreach (var item in source)
{
if (f(item))
{
yield return item;
}
}
}
这里添加了一个使用yield关键字的方法,yield作为C#的语法糖,其实就是将IEnumberable接口的迭代功能简化,这里应用到的只是其中的一部分功能,IEnumberable迭代的功能大部分都可以使用yield简化