C#高级 10 Linq操作

1.Linq操作介绍

Linq操作是C#集成的类似于数据库语言的操作,是通过将数据库的表名映射为类,把数据库的列名映射为属性。
Linq查询主要分为3类:
Linq to object(数组、list集合) --内存里面的数据
Linq to sql(查询数据库用的) --在数据库数据
Linq to XML 查询XML文件
这里主要以第一种为例,下面将会直接以代码+注释的方法来展示第一类方式如何使用linQ进行查询。

为方便读者直接复制代码进行运行,就不配置数据库,使用对象的方式来存储数据。下面直接上代码:

在这里插入图片描述
Kongfu.cs内代码如下:

public class Kongfu
{
    public int Id {  get; set; }
    public string Name { get; set; }
    public int Power {  get; set; }
    public override string ToString()
    {
        return string.Format("id:{0}, name:{1}, power:{2}", Id, Name, Power);
    }
}

MartialArtsMaster.cs内代码如下所示:

public class MartialArtsMaster
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age {  get; set; }
    public string Menpai { get; set; }
    public string Kongfu {  get; set; }
    public int Level { get; set; }

    public override string ToString()
    {
        return string.Format("id:{0}, name:{1}, Age:{2}, Menpai:{3}, Kongfu:{4}, Level:{5}",Id,Name,Age,Menpai,Kongfu,Level);
    }
}

program.cs内代码如下所示,使用了masterList 来存储人物信息,kongFuList 来存储武学信息;
同时下面也列举了,Linq查询的表达式和扩展写法、联合查询、集合查询、排序、分组等多种查询方法。

internal class Program
{
    static void Main(string[] args)
    {
        var masterList = new List<MartialArtsMaster>()
        {
            //初始化武林高手
            new MartialArtsMaster() {Id=1,Name="黄蓉",Age=18,Menpai="丐帮",Kongfu="打狗棒法",Level=9},
            new MartialArtsMaster() {Id=2,Name="洪七公",Age=70,Menpai="丐帮",Kongfu="打狗棒法",Level=10},
            new MartialArtsMaster() {Id=3,Name="郭靖",Age=22,Menpai="丐帮",Kongfu="降龙十八掌",Level=10},
            new MartialArtsMaster() {Id=4,Name="任我行",Age=50,Menpai="明教",Kongfu="葵花宝典",Level=1},
            new MartialArtsMaster() {Id=5,Name="东方不败",Age=35,Menpai="明教",Kongfu="葵花宝典",Level=10},
            new MartialArtsMaster() {Id=6,Name="林平之",Age=23,Menpai="华山",Kongfu="葵花宝典",Level=7},
            new MartialArtsMaster() {Id=7,Name="令狐冲",Age=23,Menpai="华山",Kongfu="独孤九剑",Level=10},
            new MartialArtsMaster() {Id=8,Name="梅超风",Age=23,Menpai="桃花岛",Kongfu="九阴真经",Level=8},
            new MartialArtsMaster() {Id=9,Name="黄药师",Age=23,Menpai="桃花岛",Kongfu="弹指神通",Level=10}
        };

        var kongFuList = new List<Kongfu>()
        {
            //初始化功夫
            new Kongfu(){Id=1,Name="打狗棒法",Power=90},
            new Kongfu(){Id=2,Name="降龙十八掌",Power=95},
            new Kongfu(){Id=3,Name="葵花宝典",Power=100},
            new Kongfu(){Id=4,Name="独孤九剑",Power=100},
            new Kongfu(){Id=5,Name="九阴真经",Power=100},
            new Kongfu(){Id=6,Name="弹指神通",Power=100}
        };

        //var res = new List<MartialArtsMaster>();
        //foreach (var temp in masterList)
        //{
        //    if (temp.Level > 8)
        //    {
        //        res.Add(temp);
        //    }
        //}
        //(1)使用LINQ做查询(表达式写法)
        var res1 = from m in masterList
                      //from 后面设置查询集合
                  where m.Level > 8 && m.Menpai == "丐帮"
                  //where后面跟上查询条件
                  select m; //表示m的结果结合返回
                  //select m.Name;  //表示值只返回对象中名字集合

        //(2)扩展写法
        var res2 = masterList.Where(Test1);
		//过滤方法
	    static bool Test1(MartialArtsMaster master)
	    {
	        if (master.Level > 8)
	        {
	            return true;
	        }
	        else 
	        {
	            return false;
	        }
	    }
        //(3)扩展写法
        var res3 = masterList.Where(m => m.Level > 8 &&m.Menpai == "丐帮");
        //(4)联合查询
        var res4 = from m in masterList
                   from k in kongFuList
                   where m.Kongfu == k.Name && k.Power > 90
                   select m;
        //select new { master = m, Kongfu = k };
        //(5)联合查询扩展 masterList.SelectMany(m => kongFuList) 表示 两个对象做联合查询
        var res5 = masterList.SelectMany(m => kongFuList, (m, k) => new { master = m, kongfu = k })
            .Where(x => x.master.Kongfu == x.kongfu.Name && x.kongfu.Power > 90);

        //(6)排序
        var res6 = from m in masterList
                  //from后面设置查询集合
                  where m.Level > 8 && m.Menpai=="丐帮"  
                  //按照多个属性进行排序,如果字段属性相同,就按照第二个属性排序
                  orderby m.Level,m.Age  
                  select m;

        var res7 = from m in masterList
                       //from后面设置查询集合
                   where m.Level > 8 && m.Menpai == "丐帮"
                   //按照多个属性进行排序,如果字段属性相同,就按照第二个属性排序
                   orderby m.Age descending
                   select m;
        //使用OrderByDescending 排序
        var res8 = masterList.Where(m => m.Level > 8 && m.Menpai == "丐帮").OrderByDescending(m => m.Age);

        //ThenBy表示在前面字段相同的情况下使用某个字段排序
        var res9 = masterList.Where(m => m.Level > 8).OrderBy(m => m.Level).ThenBy(m => m.Age);

        //(7)集合联合
        var res10 = from m in masterList
                  join k in kongFuList on m.Kongfu equals k.Name
                  select new { master = m, kongfu = k };

        //(8)分组查询 into groups(把武林高手按照所学功夫分类,看一下那个功夫修炼的人数最多)
        var res11 = from k in kongFuList
                  join m in masterList on k.Name equals m.Kongfu
                  into groups
                  select new { kongfu = k, count = groups.Count()};

        //(9)按自身字段分组 group
        var res12 = from m in masterList
                  group m by m.Menpai
                  into groups
                  //g.Key Key表示是按那个属性分的组
                  select new { count = groups.Count(), groups.Key };


        //(10)量词操作符 any all 判断集合中是否满足某个条件
        bool res13 = masterList.Any(a => a.Menpai == "长留");
        Console.WriteLine("是否存在“长留”门派:{0}",res13);
        bool res14 = masterList.All(a => a.Menpai == "丐帮");
        Console.WriteLine(res14);
        foreach (var temp in res12)
        {
            Console.WriteLine(temp);
        }
        Console.ReadKey();
    }

    
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VScode/Xshell连接学校服务器

vscode连学校服务器 1.连接atrust VPN2.Xshell连接服务器2.1创建一个自己的用户 3.xftp传文件4.vscode连接服务器4.1下载remote-ssh4.2连接服务器4.3激活conda环境4.4运行代码 5. pytorch版本不兼容解决方案 1.连接atrust VPN 如果是使用的是校园网&#xff0c;可以不连接 2…

数据权限-模型简要分析

权限管控可以通俗的理解为权力限制&#xff0c;即不同的人由于拥有不同权力&#xff0c;他所看到的、能使用的可能不一样。对应到一个应用系统&#xff0c;其实就是一个用户可能拥有不同的数据权限&#xff08;看到的&#xff09;和操作权限&#xff08;使用的&#xff09;。 …

VUE3相比VUE2升级了哪些内容

目录 一、Vue 3 、Vue 2 对比及提升项 二、 Vue 3 创建app.vue示例 三、Vue3 的setup、Vue2 的 data对比 一、Vue 3 、Vue 2 对比及提升项 性能提升&#xff1a;Vue 3 做了大量的优化工作&#xff0c;提升了运行时的性能。例如&#xff0c;在模板编译时进行的静态分析和优化…

第16集《佛法修学概要》

&#xff08;三&#xff09;定不定业&#xff08;2&#xff09; 请大家打开讲义第四十页&#xff0c;我们讲到定业跟不定业。 定业就是说&#xff0c;这个业的结构非常坚固&#xff0c;它有主动得果报的力量&#xff0c;不必有其他的因缘就会主动跑出来&#xff0c;甚至于在今…

Qt构建MSVC2015环境过程

Qt构建MSVC2015环境过程 前言 之前用的Qt都是基于默认的MinGW编译器&#xff0c;由于目前工作的QT界面主要是跑在X86上&#xff0c;所以记录一下Qt配置MSVC2015的配置过程。根据查阅了解以后&#xff0c;个人理解的MinGW跟MSVC的区别在于前者主要是用于跨平台程序构建&#x…

Vue项目在本地跑起来 所有路径前面想加入前缀进行访问配置

一、业务场景&#xff1a; 在本地项目跑起来了&#xff0c;访问时想在所有路径后面加dev进行访问 二、目前效果 三、具体实现步骤&#xff1a; &#xff08;1&#xff09;实现静态文件加前缀 在vue.config.js文件里改变路径 publicPath: process.env.NODE_ENV "product…

苹果Find My查找芯片-伦茨科技ST17H6x支持苹果Find My认证

Apple「查找」Find My可通过庞大的“Apple Find My Network” 实现全球查找功能。无数iOS、iPadOS、macOS、watchOS激活设备与Find My 设备结合在一起&#xff0c;无需连接到Wi-Fi或者蜂窝网络&#xff0c;用户也可以给遗失的设备定位。对于任何iOS、iPadOS、macOS、watchOS设备…

C语言中的预处理

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Golang 交叉编译之一文详解

博客原文 文章目录 Golang 中的交叉编译不同操作系统间的编译Linux 下编译windowsmacos windows 下编译Linuxmacos macos 下编译Linuxwindows 不同架构下的编译amd64x86 参考 Golang 中的交叉编译 在 Golang 中&#xff0c;交叉编译指的是在同一台机器上生成针对不同操作系统或…

MySQL之子查询、连接查询(内外)以及分页查询(实操)

文章目录 前言一、SQL脚本二、实操以及实现思路 前言 续上篇博主MySQL之视图&索引&执行计划这篇给大家讲解MySQL之子查询、连接查询(内&外)以及分页查询 一、SQL脚本 /*Navicat Premium Data TransferSource Server : localhostSource Server Type :…

文字识别与光学字符识别有什么区别?

随着科技的不断发展&#xff0c;文字识别和光学字符识别技术已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;许多人对于这两者之间的区别并不十分清楚。本文将详细探讨文字识别与光学字符识别之间的差异&#xff0c;以帮助读者更好地理解这两种技术。 文字识…

ASP.NET中小型超市管理系统源码

ASP.NET中小型超市管理系统源码 超市管理系统是专门为中小型超市打造的管理系统&#xff0c;可以方便管理时更加准确清晰的查看商品信息&#xff0c; 仓库出售与进货的信息&#xff0c;还有每一个部门员工的信息&#xff0c;也更加直观的体现出每一阶段的商品销售情况&#xf…

拦截器HandlerInterceptor | springmvc系列

拦截器&#xff0c;通俗来来将&#xff0c;就是我们将访问某个路径的请求给拦截下来&#xff0c;然后可以对这个请求做一些操作 基本使用 创建拦截器类 让类实现HandlerInterceptor接口&#xff0c;重写接口中的三个方法。 Component //定义拦截器类&#xff0c;实现Handle…

嵌入式Qt-动手编写并运行自己的第1个ARM-Qt程序

介绍了如何搭建在Linux开发板中搭建Qt的运行环境&#xff0c;并测试了Qt自带的例程。 本篇&#xff0c;来介绍如何自己编写一个Qt程序&#xff0c;并将编译结果放到Linux开发板中运行。 1 Windows上编写Qt程序 因为Qt是支持跨平台的&#xff0c;所以我们可以先在Windows平台…

【基础工具篇使用】ADB 的安装和使用

文章目录 ADB的命令安装ADB 命令使用查看帮助 ——adb help查看连接设备 ADB的命令安装 ADB 命令的全称为“Android Debug Bridge”&#xff0c;从英文中看出主要是用作安卓的调试工具。ADB 命令在嵌入式开发中越来越常用了 在 Windows 上按“win”“R”组合件打开运行, 输入 …

Java数据结构之装箱拆箱

装箱和拆箱 也叫装包拆包&#xff0c;装包是把那八种基本数据类型转换为它的包装类&#xff0c;拆包则相反 上面这俩种方式都是装包&#xff0c;下面是它的字节码文件 用到了Integer的ValueOf方法&#xff1a; 就是返回了一个Integer类的对象&#xff0c;把它的value属性设置成…

手机远程控制电脑_手机操作电脑方法

在我们的日常生活和工作中&#xff0c;有时候我们需要从外面访问家里或公司的电脑。这听起来可能很复杂&#xff0c;但实际上非常简单。今天&#xff0c;我们将分享如何使用手机远程控制电脑。 首先&#xff0c;您需要在电脑上安装KKView远程控制软件&#xff0c;该软件提供手…

【sklearn练习】preprocessing的使用

介绍 scikit-learn 中的 preprocessing 模块提供了多种数据预处理工具&#xff0c;用于准备和转换数据以供机器学习模型使用。这些工具可以帮助您处理数据中的缺失值、标准化特征、编码分类变量、降维等。以下是一些常见的 preprocessing 模块中的功能和用法示例&#xff1a; …

玩转Mysql 五(MySQL索引)

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 一、索引的数据结构 1、MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是…

操作系统期末复习笔记(持续更新..)

一、操作系统的基本概念 1.1 操作系统概念 控制和管理整个计算机系统的硬件与软件资源。合理地组织、调度计算机的工作与资源。为用户和其他软件提供方便接口与环境的程序集合。 1.2 操作系统的特征 特征&#xff1a;并发&#xff0c;共享&#xff0c;虚拟&#xff0c;异步…