首页 > 其他分享 >从Linq的Where方法理解泛型、委托应用场景

从Linq的Where方法理解泛型、委托应用场景

时间:2023-03-03 17:56:08浏览次数:36  
标签:委托 方法 Linq item 泛型 Where

   最近遇到了一个问题,Linq的Where里面传递的是什么?Where的功能是什么实现的?没有第一时间答上来,在整理相关资料后决定自行实现Linq的Where方法来加深印象。

什么是泛型

  指在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象)再进行类型的定义,通过泛型的使用大大的提高的代码的重复使用率

关于Linq

  对于Linq可以理解为一种查询方式,允许我们通过查询数据库的方式来查询数据的集合,但是对于EF框架Linq所生成的是SQL语句,但是对于继承于IEnumerable的对象,Linq的本质是做循环.

关于委托

  委托是一个类,定义了方法的类型,可以把方法作为参数来传递;提到委托就不得不提到事件,事件一般被概括为特殊的委托,和委托不同之处在于对象可以通过事件像其他对象通知发生的相关事情,事件实现了订阅和发布的功能,可以简单的理解为类似于前端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简化

标签:委托,方法,Linq,item,泛型,Where
From: https://www.cnblogs.com/LearnerPing/p/17176373.html

相关文章

  • DataTable转泛型集合
    usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Reflection;namespaceBT.Preservation.Models{publicstaticclassExtend......
  • 五分钟重温C# 委托,匿名方法,Lambda,泛型委托,表达式树
    五分钟重温C#委托,匿名方法,Lambda,泛型委托,表达式树翔星有10年+工作经验,高级软件工程师,可以解决各种问题​关注 1人赞同了该文章第一分钟:委托有......
  • #yyds干货盘点#【愚公系列】2023年02月 .NET/C#知识点-委托、匿名方法、Lambda、泛型
    前言在.NET中,委托是一种类型,它可以持有对一个或多个方法的引用,并允许将这些方法作为参数传递给其他方法。.NET中的委托类似于C和C++中的函数指针,但具有更高的类型安......
  • 泛型
    历史泛型在Java1.5版本被引入泛型的本质是参数化类型泛型类型只能是引用类型,即不能是8钟基本数据类型使用List<T1extendsT2>,表示T1类型不能是T2类型的父类......
  • day03-面向对象高级3-内部类&枚举&泛型
    1,内部类回顾:之前学了类的四个成员,分别是成员变量,成员方法,代码块,构造器,现在这是第五个成员,内部类;前三个作了解,第四个重点学习。内部类的应用场景......
  • C#/.NET知识点总结【泛型】
     泛型极大提高代码可用性,可以重复使用对象,定义一个反省对象后,我们可以赋值成string类型,int类型,类型是安全的性能也有提高  https://www.ktanx.com/blog/p/665 ......
  • SQL语句中 left join 后用 on 还是 where,区别大了!
    前天写SQL时本想通过AleftBjoinonand后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。后来发现joinonand不会过滤结果记录条数,只会根据and后的条件......
  • 关于运行时类的父类的泛型的获取
    固定模板Classclazz=Class.forName("...");//获取带泛型的父类(Type是一个接口,Class实现了此接口)Typesuperclass=clazz.getGenericSuperClass();//如果父类是......
  • 泛型
    泛型packageGenerics;//泛型类就是属性的数据类型不确定,在创建对象的时候再确定.publicclassa1<T>{//属性类型是<T>泛型privateTname;p......
  • Rust - 安装环境、基本类型、流程控制、函数、模块、泛型、所有权
    安装环境、基本类型学习Rust语言是公司同事最先开始提议的,准备用接下来的项目试试水,Rust是一个强类型编译型语言,比较偏向底层,所以开启了Rust的探索之旅。环境准备阶段安......