C#高级 10 Linq操作

news2024/11/16 18:30:22

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();
    }

    
}

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

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

相关文章

告别冗余空白,批量删除空白行

你是否遇到过这样的尴尬情况&#xff1a;花费了大量时间整理的文档&#xff0c;却在最后发现其中充斥着无用的空白行&#xff0c;这些多余的空行不仅影响美观&#xff0c;还让整个文档显得杂乱无章。今天&#xff0c;我要给大家介绍一款强大且实用的工具——首助编辑高手&#…

Go采集1688网站数据对比商品价格

最近看了下多多和1688的一些商品价格&#xff0c;发现好多店铺都是无货源拿货一件发货&#xff0c;这就导致层层叠加价格翻了不知道几倍&#xff0c;真所谓多花钱办的事还是一样&#xff0c;因此&#xff0c;今天我就通过一个爬虫程序监控对应商品价格&#xff0c;了解行业龙头…

Java 最小优先队列API设计与实现

Java 学习面试指南&#xff1a;https://javaxiaobear.cn 最小的元素放在数组的索引1处。每个结点的数据总是小于等于它的两个子结点的数据。 1、API设计 类名MinPriorityQueue构造方法MinPriorityQueue(int capacity)&#xff1a;创建容量为capacity的MinPriorityQueue对象成员…

Oracle11.2.0.4从RMAN备份中快速恢复单个表的方法

文章目录 前言一、查询所要恢复的表所涉及的表空间二、创建用于恢复的数据库三、恢复步骤1.恢复控制文件2.修改redo日志名称3.表空间恢复4.表空间recover5.查询数据 前言 由于用户误操作导致某表中的数据错乱&#xff0c;导致业务不能正常使用&#xff0c;现需要将该表恢复到一…

国家数据局——《“数据要素×”三年行动计划(2024—2026年)》

为深入贯彻党的二十大和中央经济工作会议精神&#xff0c;充分发挥数据要素乘数效应&#xff0c;赋能经济社会发展&#xff0c;近日&#xff0c;国家数据局会同中央网信办、科技部、工业和信息化部、交通运输部、等部门联合印发《“数据要素”三年行动计划&#xff08;2024—20…

VS中打开ui文件闪退

解决办法&#xff1a; 依次点击《扩展》-> 《Qt vs tools》-> 《options》-> 《Qt》-> 《general》 -> 《Qt Designer》 -> 《run in detached window》 -> true

Swift单元测试Quick+Nimble

文章目录 使用QuickNimble1、苹果官方测试框架XCTest的优缺点2、选择QuickNimble的原因&#xff1a;3、QuickNimble使用介绍集成&#xff1a;Quick关键字说明&#xff1a;Nimble中的匹配函数等值判断&#xff1a;使用equal函数是否是同一个对象&#xff1a;使用beIdenticalTo函…

java智慧医院互联网智慧3D导诊系统源码,经由智慧导诊系统多维度计算,准确推荐科室

什么是智慧导诊系统? 简单地说&#xff0c;智慧导诊系统是一种利用人工智能技术&#xff0c;为医生提供帮助的系统。它可以通过分析患者的症状和病史为医生提供疾病诊断和治疗方案的建议。 系统介绍&#xff1a; 医院智慧导诊系统是在医院中使用的引导患者自助就诊挂号&…

Python单继承,子类调用父类方法,使用super关键字

但是这么写话还是并不符合我们平时写代码的规范&#xff0c;一般都是用super来调用&#xff0c;贴代码&#xff1a; # 面向对象的3大特征&#xff1a;继承性&#xff0c;封装性&#xff0c;多态性 class Human():sum1 0def __init__(self, name, age):self.name nameself.ag…

机器学习指南:如何学习机器学习?

机器学习 一、介绍 你有没有想过计算机是如何从数据中学习和变得更聪明的&#xff1f;这就是机器学习 &#xff08;ML&#xff09; 的魔力&#xff01;这就像计算机科学和统计学的酷炫组合&#xff0c;计算机从大量信息中学习以解决问题并做出预测&#xff0c;就像人类一样。 …

前端国际化之痛点(二):多包多库场景下联动多语言

前言 VoerkaI18n是一款非常优秀的前端国际化解决方案&#xff0c;其开发的出发点是为了解决现存多语言的一些痛点,接下来几篇文章将分别进行分析。 前端国际化之痛点(一)&#xff1a;让人头疼的词条Key前端国际化之痛点(二)&#xff1a;多包多库场景下联动多语言前端国际化之…

JavaScript数组sort()对负数排序的陷阱

前言 想着好久没去力扣刷题了&#xff0c;刚好手上的需求也差不多了&#xff0c;就去看了看。看到一个难度级别为困难的题&#xff0c;看到这个题想着直接使用JS现成的方法&#xff0c;先concat再sort。再取中间值不就实现了吗。是不是你们也这么想&#xff0c;哈哈哈。 就是…

人逢三六九,运势低迷路难走

很多人都希望自己各方面的运势都能够朝着好的方向旺盛发展&#xff0c;我们的运势将会如何发展跟我们的出生时间是离不开关系的。我们的祖先为了后人着想&#xff0c;不犯他们犯过的错误&#xff0c;少走一些弯路&#xff0c;总结了多年来的生活经验&#xff0c;创造出了一句句…

Unity3d 实现直播功能(无需sdk接入)

Unity3d 实现直播功能 需要插件 :VideoCapture 插件地址(免费的就行) 原理:客户端通过 VideoCapture 插件实现推流nodejs视频流转服务进行转发,播放器实现rtmp拉流 废话不多说,直接上 CaptureSource我选择的是屏幕录制,也可以是其他源 CaptureType选择LIVE–直播形式 LiveSt…

【面试高频算法解析】算法练习2 回溯(Backtracking)

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯&#xff08;Backtracking&…

苹果QQ群聊天记录怎么删除?收藏好这两个技巧!

无论我们使用什么手机&#xff0c;我们都可以在QQ上与好友进行交流和社交。然而&#xff0c;有时候我们可能需要删除一些不需要的聊天记录&#xff0c;特别是群聊记录&#xff0c;以此来扩大手机内存。那么&#xff0c;苹果手机的qq群聊天记录怎么删除呢&#xff1f;小编将为大…

电子学会C/C++编程等级考试2023年12月(一级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分…

使用 C# 和 WinForms 创建动态图表

使用 C# 和 WinForms 创建动态图表 这次我们将学习如何使用 C# 和 WinForms 创建动态图表。我们将使用 Chart 控件来创建图表&#xff0c;并使用多线程技术实现动态更新图表数据的效果。 方法一&#xff1a;在项目启动时实例化图表 在 DoWork 方法中&#xff0c;我们使用 Ra…

宝塔上的琉璃灯(for循环试炼)

8层宝塔上共有765盏琉璃灯&#xff0c;每层灯数都是上层的一倍&#xff0c;编程输出每层灯数。 (笔记模板由python脚本于2024年01月09日 16:41:22创建&#xff0c;本篇笔记适合熟悉循环编程的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python…

【教程】代码混淆详解

目录 引言 正文 什么是代码混淆 ProGuard混淆文件参数详解 代码混淆的方法 Ipa Guard工具的使用方法 IPA重签名与安装测试 总结 本文将对代码混淆进行详细解释&#xff0c;并介绍ProGuard代码混淆器以及Ipa Guard工具的使用方法。首先&#xff0c;我们将了解代码混淆的概…