Csharp学习Linq

Linq的学习

这里继续使用之前文章创建的学生类,首先简单介绍一下linq的使用。

Student.cs

 public class Student{public int Id { get; set; }public int ClassId { get; set; }public string Name { get; set; }public int Age { get; set; }public string Description { get; set; }public void Study(){Console.WriteLine($"{this.Id} {this.Name} 跟着老师学习 .Net开发");}public void StudyQt(){Console.WriteLine($"{this.Id} {this.Name} 跟着老师学习C++ Qt");}}

初始化学生数据

public class LinqPrinciple
{private List<Student> GetStudentsList(){List<Student> students = new List<Student>(){ new Student() { Id = 1, ClassId = 1, Name = "张三", Age = 20, Description = "张三是一个好学生" },new Student() { Id = 2, ClassId = 1, Name = "李四", Age = 21, Description = "李四是一个好学生" },new Student() { Id = 3, ClassId = 2, Name = "王五", Age = 22, Description = "王五是一个好学生" },new Student() { Id = 4, ClassId = 2, Name = "赵六", Age = 23, Description = "赵六是一个好学生" },new Student() { Id = 5, ClassId = 3, Name = "孙七", Age = 24, Description = "孙七是一个好学生" },new Student() { Id = 6, ClassId = 3, Name = "周八", Age = 25, Description = "周八是一个好学生" },new Student() { Id = 7, ClassId = 1, Name = "绿春", Age = 30, Description = "张三是一个好学生" },new Student() { Id = 8, ClassId = 1, Name = "麻醉", Age = 35, Description = "李四是一个好学生" },new Student() { Id = 9, ClassId = 2, Name = "开天", Age = 26, Description = "王五是一个好学生" },new Student() { Id = 10, ClassId = 2, Name = "匹敌", Age = 22, Description = "赵六是一个好学生" },new Student() { Id = 11, ClassId = 3, Name = "独轮车", Age = 23, Description = "孙七是一个好学生" },new Student() { Id = 12, ClassId = 3, Name = "火箭英", Age = 20, Description = "周八是一个好学生" }};return students;}
}

下面写几个简单的linq的语句,大概知道一下它的使用.

public void  Show(){//获取一下ClassID为3的学生们List<Student> students = GetStudentsList();List<Student> studentsId=students.Where(s => s.ClassId == 3).ToList();Console.WriteLine("********************************1*****************************");foreach (var student in studentsId){Console.WriteLine($"{student.Id} {student.Name} {student.Age} {student.Description}");}Console.WriteLine("********************************2*****************************");//获取一下年纪大于24的学生们List<Student> studentsAge = students.Where(s => s.Age > 24).ToList();foreach (var student in studentsAge){Console.WriteLine($"{student.Id} {student.Name} {student.Age} {student.Description}");}Console.WriteLine("********************************3*****************************");//获取一下年纪小于23同时ClassID为2的学生们List<Student> studentsAgeClassId = students.Where(s => s.Age < 23 && s.ClassId == 2).ToList();foreach (var student in studentsAgeClassId){Console.WriteLine($"{student.Id} {student.Name} {student.Age} {student.Description}");}}

linq的原理的探究

下面尝试探索一下这个linq的本质是什么?

尝试自己实现一下这3个需求代码,如下

 List<Student> students = GetStudentsList();List<Student> studentsId=new List<Student>();foreach (var student in students){if (student.ClassId == 3){studentsId.Add(student);}}List<Student> studentsAge=new List<Student>();foreach (var student in students){if (student.Age > 24){studentsAge.Add(student);}}List<Student> studentsAgeClassId=new List<Student>();foreach (var student in students){if (student.Age < 23 && student.ClassId == 2){studentsAgeClassId.Add(student);}}

这上面的代码有什么问题?

大量的重复代码---最好是封装一些,把重复的代码统一封装;

这里使用一个解决方案

封装一个方法,将判断的逻辑独立到一个小方法中去.

        public static bool  IsOk01(Student student){return student.ClassId == 3;}public static bool IsOk02(Student student){return student.Age > 24;}public static bool IsOk03(Student student){return student.Age < 23 && student.ClassId == 2;}public static List<Student> DragonWhere(List<Student> studentlist,Func<Student,bool> Func){List<Student> students = new List<Student>();foreach (var student in studentlist){if (Func(student)){students.Add(student);}}return students;}

尝试使用一下封装的函数

List<Student> students = GetStudentsList();
List<Student> studentId= MethodExtension.DragonWhere(students, MethodExtension.IsOk01);

这里还可以使用扩展方法和lambda表达式进一步的优化我们的代码

      public static List<Student> DragonWhere(this List<Student> studentlist,Func<Student,bool> Func){List<Student> students = new List<Student>();foreach (var student in studentlist){if (Func(student)){students.Add(student);}}return students;}

在调用的时候,

List<Student> students = GetStudentsList();
List<Student> studentsId = students.DragonWhere(s => s.ClassId == 3);

这里就串联上了我们之前学到的知识,最后为了支持多种数据类型,使用上泛型,最后我们就得到了最终封装的方法.

 public static List<T> DragonWhere<T>(this List<T> studentlist,Func<T,bool> Func){List<T> students = new List<T>();foreach (var student in studentlist){if (Func(student)){students.Add(student);}}return students;}

这里也要使用ilspy反编译一下它们的实现是如何?

看起来跟我们自己实现的Where差不多的样子.

img

再去看一下它的movenext函数.

img

这个就是一个yield return反汇编出来的状态机的代码。

linq常见的语句

 public void Show(){List<Student> studentList = this.GetStudentList(); #region Linq 扩展方法&表达式{  var list = studentList.Where<Student>(s => s.Age < 30); //list里面必然是符合要求的数据;foreach (var item in list){Console.WriteLine("Name={0}  Age={1}", item.Name, item.Age);}}{Console.WriteLine("********************");var list = from s in studentListwhere s.Age < 30select s;   //list里面必然是符合要求的数据;foreach (var item in list){Console.WriteLine("Name={0}  Age={1}", item.Name, item.Age);}}#endregion#region linq to object Show{Console.WriteLine("********************");var list = studentList.Where<Student>(s => s.Age < 30).Select(s => new  //投影:可以做一些自由组装+ new 一个匿名类,也可以new 具体类;{IdName = s.Id + s.Name,ClassName = s.ClassId == 2 ? "高级班" : "其他班"});foreach (var item in list){Console.WriteLine("Name={0}  Age={1}", item.ClassName, item.IdName);}}{Console.WriteLine("********************");var list = from s in studentListwhere s.Age < 30select new{IdName = s.Id + s.Name,ClassName = s.ClassId == 2 ? "高级班" : "其他班"};foreach (var item in list){Console.WriteLine("Name={0}  Age={1}", item.ClassName, item.IdName);}}{Console.WriteLine("********************");var list = studentList.Where<Student>(s => s.Age < 30)//条件过滤.Select(s => new//投影{Id = s.Id,ClassId = s.ClassId,IdName = s.Id + s.Name,ClassName = s.ClassId == 2 ? "高级班" : "其他班"}).OrderBy(s => s.Id)//排序 升序.ThenBy(s => s.ClassName) //多重排序,可以多个字段排序都生效.OrderByDescending(s => s.ClassId)//倒排.Skip(2)//跳过几条  //必须要先排序.Take(3)//获取几条 //必须要先排序;foreach (var item in list){Console.WriteLine($"Name={item.ClassName}  Age={item.IdName}");}}{//group by·Console.WriteLine("********************");var list = from s in studentListwhere s.Age < 30group s by s.ClassId into sgselect new{key = sg.Key,maxAge = sg.Max(t => t.Age)};foreach (var item in list){Console.WriteLine($"key={item.key}  maxAge={item.maxAge}");}//group by new {s.ClassId,s.Age}//group by new {A=s.ClassId>1}}{Console.WriteLine("********************");var list = studentList.GroupBy(s => s.ClassId).Select(sg => new{key = sg.Key,maxAge = sg.Max(t => t.Age)});foreach (var item in list){Console.WriteLine($"key={item.key}  maxAge={item.maxAge}");}}{var list = studentList.GroupBy(s => s.ClassId);foreach (var date in list) ///实现了IEnumerable{Console.WriteLine(date.Key);foreach (var item in date){Console.WriteLine(item.Age);}}}List<Class> classList = new List<Class>(){new Class(){Id=1,ClassName="架构班"},new Class(){Id=2,ClassName="高级班"},new Class(){Id=3,ClassName="全栈班"},};{//Join var list = from s in studentListjoin c in classList on s.ClassId equals c.Id  //只能使用equals  不能使==select new{Name = s.Name,CalssName = c.ClassName};foreach (var item in list){Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");}}{var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new{Name = s.Name,CalssName = c.ClassName});foreach (var item in list){Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");}}{//左连接var list = from s in studentListjoin c in classList on s.ClassId equals c.Idinto scListfrom sc in scList.DefaultIfEmpty()//select new{Name = s.Name,CalssName = sc == null ? "无班级" : sc.ClassName//c变sc,为空则用};foreach (var item in list){Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");}Console.WriteLine(list.Count());}{var list = studentList.Join(classList, s => s.ClassId, c => c.Id, (s, c) => new{Name = s.Name,CalssName = c.ClassName}).DefaultIfEmpty();//为空就没有了foreach (var item in list){Console.WriteLine($"Name={item.Name},CalssName={item.CalssName}");}Console.WriteLine(list.Count());}{//左连接和右链接  就是链接对象交换一下即可;}#endregion}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于python+vue 的一加剧场管理系统的设计与实现flask-django-nodejs-php

二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

Kubernetes自动化配置部署

在新建工程中&#xff0c;使用k8s的devops服务&#xff0c;自动化部署项目 1、在搭建好k8s的集群中&#xff0c;确认已开启devops服务&#xff1b; 2、新建Maven项目之后&#xff0c;创建dockerfile、deploy和Jenkins文件 例如&#xff1a; Dockerfile FROM bairong.k8s.m…

【思维】第十四届蓝桥杯省赛C++ C组/研究生组 Python A组/C组《翻转》(C++)

【题目描述】 小蓝用黑白棋的 n 个棋子排成了一行&#xff0c;他在脑海里想象出了一个长度为 n 的 01 串 T&#xff0c;他发现如果把黑棋当做 1&#xff0c;白棋当做 0&#xff0c;这一行棋子也是一个长度为 n 的 01 串 S。 小蓝决定&#xff0c;如果在 S 中发现一个棋子和它…

C#,图论与图算法,有向图(Direct Graph)广度优先遍历(BFS,Breadth First Search)算法与源程序

1 图的广度优先遍历 图的广度优先遍历(或搜索)类似于树的广度优先遍历(参见本文的方法2)。这里唯一需要注意的是,与树不同,图可能包含循环,因此我们可能再次来到同一个节点。为了避免多次处理节点,我们使用布尔访问数组。为简单起见,假设所有顶点都可以从起始顶点到达…

ideaSSM 学员信息管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 学员信息管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

C语言基础知识复习(考研)

&#xff08;1&#xff09;C语言文件操作 1 什么是文件 文件有不同的类型&#xff0c;在程序设计中&#xff0c;主要用到两种文件&#xff1a; (1)程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行这种文件的内容是程序代码。 (2)数据文件。文件的内容不是…

软件测试相关内容第五弹 -- 自动化测试Selenium

写在前&#xff1a;hello这里是西西~ 这边博客主要学习关于自动化测试的相关内容&#xff0c;首先了解自动化测试的相关理论知识&#xff0c;其次学习web应用中基于UI的自动化测试框架 - selemium[需要重点掌握selenium工作原理]&#xff0c;实操selenium,最后学习Junit相关知识…

当我想用ChatGPT-Next-Web来套壳Azure OpenAI Service时

使用Cloudflare worker来代理Azure OpenAI API&#xff0c; 并将其转换为兼容OpenAI的API 一直没能搞定OpenAI的订阅&#xff0c; 就因为没有搞定国外的信用卡&#xff0c; 所以就一直使用GPT-3.5来处理日常的文字生成工作&#xff0c; 例如写文档&#xff0c; 生成一些简单的脚…

AI助力生产制造质检,基于轻量级YOLOv8n模型开发构建工业生产制造场景下的瓷砖瑕疵检测识别分析系统

瓷砖生产环节一般经过原材料混合研磨、脱水、压胚、喷墨印花、淋釉、烧制、抛光&#xff0c;最后进行质量检测和包装。得益于产业自动化的发展&#xff0c;目前生产环节已基本实现无人化。而质量检测环节仍大量依赖人工完成。一般来说&#xff0c;一条产线需要配数名质检工&…

论文阅读-MIPD:一种用于分布式深度神经网络训练的自适应梯度稀疏化框架

摘要—基于参数服务器架构的异步训练广泛应用于大规模数据集和深度神经网络模型的扩展训练。在大规模分布式深度学习系统中&#xff0c;通信一直被认为是主要瓶颈。最近的研究尝试通过梯度稀疏化和量化方法来减少通信流量。我们发现前期研究存在三个限制。首先&#xff0c;他们…

YOLOv5-Y5周:yolo.py文件解读

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Tensorflow/Pytorch 1.8.0cu111 一、代码解读 import argparse i…

【洛谷 P8715】[蓝桥杯 2020 省 AB2] 子串分值 题解(组合数学+乘法原理)

[蓝桥杯 2020 省 AB2] 子串分值 题目描述 对于一个字符串 S S S, 我们定义 S S S 的分值 f ( S ) f(S) f(S) 为 S S S 中恰好出现一次的字符个数。例如 f ( ′ ′ a b a ′ ′ ) 1 f\left({ }^{\prime \prime} \mathrm{aba}{ }^{\prime \prime}\right)1 f(′′aba′′)…

Vscode与Cmake搭配配置opencv使用

vscode与Cmake基本使用 下载插件 CtrlShiftp打开VSCode的指令面板&#xff0c;然后输入cmake:q&#xff0c;VSCode会根据输入自动提示&#xff0c;然后选择CMake: Quick Start选择编译器根据提示输入项目名称选择可执行文件编译项目 方式一&#xff1a;执行命令cd build cmake…

一键将自己网增加一个抖音小程序-源代码

把自己的网址链接&#xff0c;也就是你想要的一个页面转变为抖音小程序&#xff0c;让你轻松拥有一个自己的抖音小程序。 几分钟搞定。 跟着视频来操作就可以了&#xff0c;很简单。视频一定要完整看完啊&#xff0c;对于小白。 如果你的网址可能有不好过审核的页面&#xff0c…

基于python+vue的stone音乐播放器的设计与实现flask-django-php-nodejs

随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;stone音乐播放器展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为解决用…

华为配置WLAN 802.1X认证实验

配置WLAN 802.1X认证示例 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤 业务需求 用户接入WLAN网络&#xff0c;使用802.1X客户端进行认证&#xff0c;输入正确的用户名和密码后可以无线上网。且在覆盖区域内移动发生漫游时&…

MySQL面试题--MySQL内部技术架构

目录 1.Mysql内部支持缓存查询吗&#xff1f; 2.MySQL8为何废弃掉查询缓存&#xff1f; 3.替代方案是什么&#xff1f; 4.Mysql内部有哪些核心模块组成&#xff0c;作用是什么&#xff1f; 5.一条sql发送给mysql后&#xff0c;内部是如何执行的&#xff1f;&#xff08;说…

MYSQL 同步到ES 如何设计架构保持一致性

简单使用某个组件很容易&#xff0c;但是一旦要搬到生产上就要考虑各种各样的异常&#xff0c;保证你方案的可靠性&#xff0c;可恢复性就是我们需要思考的问题。今天来聊聊我们部门在 MYSQL 同步到ES的方案设计。 在面对复杂条件查询时&#xff0c;MYSQL往往显得力不从心&…

Gitlab介绍

1.什么是Gitlab GitLab是一个流行的版本控制系统平台&#xff0c;主要用于代码托管、测试和部署。 GitLab是基于Git的一个开源项目&#xff0c;它提供了一个用于仓库管理的Web服务。GitLab使用Ruby on Rails构建&#xff0c;并提供了诸如wiki和issue跟踪等功能。它允许用户通…

从0到1实现RPC | 02 RpcConsumer的远程调用

一、RPC的简化版原理如下图&#xff08;核心是代理机制&#xff09;。 1.本地代理存根: Stub 2.本地序列化反序列化 3.网络通信 4.远程序列化反序列化 5.远程服务存根: Skeleton 6.调用实际业务服务 7.原路返回服务结果 8.返回给本地调用方 二、新建一个模块rpc-demo-c…