最近遇到了一个问题,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的Where方法理解泛型、委托应用场景的更多相关文章

  1. c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...

  2. C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法

    使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...

  3. 匿名方法、Lambda表达和自定义泛型委托以及Func、Action系统泛型委托

    1.匿名方法的概念:一个方法没有具体的名称,而只有关键字delegate.方法参数.方法体.这种方法是匿名方法. 匿名方法的好处:将具体方法和委托直接关联在一起,如果我们基于委托只需要一个方法的时候, ...

  4. 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

    一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. p ...

  5. .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解

    本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...

  6. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

  7. 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...

  8. 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树

    用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...

  9. 普通委托到泛型委托到Linq

    private delegate bool delTest(int a); private void button1_Click(object sender, EventArgs e) { var a ...

  10. C#委托,匿名方法,Lambda,泛型委托,表达式树代码示例

    第一分钟:委托 有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件.先上一段代码: 下边的代码,完成了一个委托应用的演示.一个委托分三个步骤: ...

随机推荐

  1. TokenObtainPairSerialize

    TokenObtainPairSerializer是Django REST framework的SimpleJWT库提供的序列化器.它用于对用户凭据(如用户名和密码)进行序列化和验证,并在成功的身份验 ...

  2. oeasy 教您玩转linux 010304 图形界面 xfce

    我们来回顾一下 上一部分我们都讲了什么? 讲了文件管理器和命令行终端互相交互 用命令nautilus在文件管理器打开某路径 这次我们来看看 图形用户界面(GUI)的情况 图形界面和发行版的关系 一个发 ...

  3. oeasy教您玩转python - 001 - # 换行插入

    ​ 先跑起来 Python 什么是 Python? Python 很好用 适合初学者 而且在各个领域都很强大 ​ 后来居上 ​ 上图可以点开 python3 早已有之 最终逆风翻盘 当然 java 也 ...

  4. ABC357-C题解

    最近一直掉分,谔谔. 分析 发现机房里面除了我以外都用递归写的,那我就来讲一种非递归的吧. 考虑第 \(i\) 级地毯拆成九块以后其实就是八块第 \(i-1\) 级地毯与一块大小为 \(3^{i-1} ...

  5. PyQt 右键菜单的实现(Qt.CustomContextMenu方式)

    从Qt文档Qt::ContextMenuPolicy的值可以看出,实现右键菜单的方式有三种,这对于所有继承于QWidget的类都是通用的,在用每一种方式实现之前都要调用QWidget::setCont ...

  6. VUE小知识~作用域插槽

    作用域插槽可以为我们向组件内插入特定的标签,方便修改维护. 组件内需要使用 <slot></slot>进行插槽站位. 组件标签内需要使用<template > &l ...

  7. PyCharm配置Miniconda3

    打开PyCharm,点击"File"(文件)菜单,选择"Settings"(设置) 选择python interpreter中的配置 选择add 选择Conda ...

  8. 对比python学julia(第三章:游戏编程)--(第二节)公主迎圣诞(4)

    4.  碰撞检测 .得分及生命 在第 4 个阶段,利用GameZero的碰撞检测功能,使公主角色能够接到雪花 .礼物或剪刀. 在"sdgz"项目目录中 ,把 version3.jl ...

  9. 【ServerSentEvents】服务端单向消息推送

    依赖库: Springboot 不需要而外支持,WebMVC组件自带的类库 浏览器要检查内核是否支持EventSource库 Springboot搭建SSE服务: 这里封装一个服务Bean, 用于管理 ...

  10. 【Scala】09 偏函数 PartialFunction

    更像是策略函数 可拆分成一个部分,是若干个函数的组合 package cn object HelloScala { def main(args: Array[String]): Unit = { // ...