从Linq的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的Where方法理解泛型、委托应用场景的更多相关文章
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...
- C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法
使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...
- 匿名方法、Lambda表达和自定义泛型委托以及Func、Action系统泛型委托
1.匿名方法的概念:一个方法没有具体的名称,而只有关键字delegate.方法参数.方法体.这种方法是匿名方法. 匿名方法的好处:将具体方法和委托直接关联在一起,如果我们基于委托只需要一个方法的时候, ...
- 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)
一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. p ...
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...
- 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解
1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...
- 用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托,表达式树这些应用.今天我尝试用简单的方法叙述一下,让大家在五 ...
- 转帖:用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树
用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树 这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实践才能掌握委托 ...
- 普通委托到泛型委托到Linq
private delegate bool delTest(int a); private void button1_Click(object sender, EventArgs e) { var a ...
- C#委托,匿名方法,Lambda,泛型委托,表达式树代码示例
第一分钟:委托 有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件.先上一段代码: 下边的代码,完成了一个委托应用的演示.一个委托分三个步骤: ...
随机推荐
- go语言的基础语法
字符串数组 package main import ( "fmt" ) func main() { var str string str = "hello world&q ...
- Go微服务开发指南
在这篇深入探讨Go语言在微服务架构中的应用的文章中,我们介绍了选择Go构建微服务的优势.详细分析了主要的Go微服务框架,并探讨了服务发现与注册和API网关的实现及应用. 关注TechLead,复旦博士 ...
- Django 继承AbstractUser扩展用户模型
Django 继承AbstractUser扩展用户模型 by:授客 QQ:1033553122 测试环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方 ...
- RestSharp编写api接口测试,并实现异步调用(不卡顿)
首先,确保你已经安装了RestSharp NuGet包.如果没有安装,可以通过以下命令安装: bash Install-Package RestSharp 然后,在你的C#代码中,你可以按照以下步骤操 ...
- 带你学习通过GitHub Actions如何快速构建和部署你自己的项目,打造一条属于自己的流水线
本文主要讲解通过github的actions来对我们项目进行ci/cd 一.actions简介 GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成.测试和 ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-55- 上传文件 (非input控件)- 中篇
1.简介 在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等.所以宏哥打算按上传文件的分类对其进行一下讲解和分享. 2.上传文件的API(非input ...
- 关于visual studio的一个bug
本人初学链表,如有错误多多包涵 快马加鞭,这期只写一个问题.我好像在vs里面发现了一个bug 不管是vs2022还是vs2010都无法正常运行.关于cin.string.链表的问题 #include& ...
- dcoker file
dockerfile是来构建镜像文件 [root@docker docker-test-volume]# pwd /home/docker-test-volume vi ./dockerfile 通过 ...
- Known框架实战演练——进销存财务管理
本文介绍如何实现进销存管理系统的财务对账模块,财务对账模块包括供应商对账和客户对账2个菜单页面.供应商和客户对账字段相同,因此可共用一个页面组件类. 项目代码:JxcLite 开源地址: https: ...
- Jmeter二次开发函数 - 文本替换
此篇文章将在Jmeter创建一个新函数,实现替换文本中的指定内容功能.效果图如下 1.eclipse项目创建步骤此处省略,可参考上一篇Jmeter二次开发函数之入门 2.新建class命名为" ...