C# LINQ

news2025/2/4 4:51:28

一、前言

   学习心得:C# 入门经典第8版书中的第22章《LINQ》

二、LINQ to XML

我们可以通过LINQ to XML来创造xml文件 如下示例,我们用LINQ to XML来创造。

<Books>
  <CSharp Time="2019">
    <book>C# 入门经典</book>
    <book>C# 高级编程</book>
    <book>C# 深入解析</book>
    <book>WPF 编程宝典</book>
  </CSharp>
  <Java>
  </Java>
</Books>

第一步引用命名空间

using System;
using System.Xml.Linq;

第二步 示例代码(两种写法)

   static void Main(string[] args)
   {
       XDocument doc = new XDocument(
           new XElement("Books", new XElement(
               "Charp", new XAttribute("Time", 2019),
               new XElement(new XElement("book", "C# 入门编程")),
               new XElement(new XElement("book", "C# 高级编程")),
               new XElement(new XElement("book", "深入解析")),
               new XElement(new XElement("book", "编程宝典"))),
               new XElement(new XElement("Java", " "))));
       Console.WriteLine(doc);


      
       Console.WriteLine("------分割线--------");



       XDocument doc2 = new XDocument(
       new XElement("Books",
       new XElement("CSharp",
       new XAttribute("Time", 2019),
       new[] { new XElement("Book", "C# 入门编程"),
               new XElement("Book", "C# 高级编程"),
               new XElement("Book", "深入解析"),
               new XElement("Book", "编程宝典")        }
         ),
       new XElement("Java")
        )
       );
       Console.WriteLine(doc2);
       Console.ReadLine();

   }

执行效果:

三、LINQ查询语法

LINQ查询语法可以帮助我们快速的查询我们想要的数据,对集合数组都管用。

第一步引用:

using System;
using System.Linq;

第二步(示例代码) 

        string[] chineseStrings = {
"你好", "世界", "学习", "编程", "科技",
"创新", "发展", "梦想", "努力", "成就",
"希望", "未来", "探索", "挑战", "实现"
                                        };
        var L = from n in chineseStrings where n.Contains("习") select n;
        foreach (var l in L) { Console.WriteLine(l); }
        Console.ReadLine();

示例解释:LINQ 查询语法来查找 chineseStrings 数组中包含特定字符("习")的成员,并将结果存储在变量 L 中。这里的 from 关键字用于指定集合中的元素,where 关键字用于筛选满足特定条件的元素,select 则用于选择要返回的内容。

四、LINQ方法语法

上述代码我们可以使用扩展方法来实现同样效果。使用Where<T> 方法

举个例子:

        string[] chineseStrings = {
"你好", "世界", "学习", "编程", "科技",
"创新", "发展", "梦想", "努力", "成就",
"希望", "未来", "探索", "挑战", "实现"
                                        };
        //var L = from n in chineseStrings where n.Contains("习") select n;
       var L= chineseStrings.Where(n => n.Contains("习"));
        foreach (var l in L) { Console.WriteLine(l); }
        Console.ReadLine();

示例解释:通过chineseStrings“.”就能看见很多可以使用的扩展方法。

五、LINQ排序查询结果

orderby 子句 orderby默认排序是A-Z 但如果加入了descending 关键字则代表相反

        string[] chineseStrings = {
"啊", "吧", "从", "的", "额",
"发", "就", "和", "就",
"看", "了", "吗", "你", "哦"
                                        };
        var L = from n in chineseStrings orderby n descending select n;

        foreach (var l in L) { Console.WriteLine(l); }
        Console.ReadLine();

当前示例:对数组进行降序排序


输出效果:哦--你--吗--了--看--就--就--和--发--额--的--从--吧--啊--。

当然您可以自定义升序排序(默认不写关键字就是升序)

        string[] chineseStrings = {
"啊", "吧啊", "从啊啊", "的啊啊啊", "额啊啊啊啊",
"发啊啊啊啊啊"
                                        };
        var L = from n in chineseStrings orderby n.Length select n;

        foreach (var l in L) { Console.WriteLine(l); }
        Console.ReadLine();

 执行效果: 

六、聚合运算符

        聚合函数是指用于对一组数据执行计算,并返回单个结果的函数。这些函数通常用于对数据集合进行汇总、计数、平均值、最大值、最小值等操作。LINQ(Language Integrated Query)是 C# 中处理集合的强大工具之一,它提供了一系列的聚合函数可以应用在查询中。


using System;
using System.Linq;
namespace My
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] fiftyElementArray = new int[50] {
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
    11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
    21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
    31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50
};
            Console.WriteLine($"数组元素个数{fiftyElementArray.Count()}");
            Console.WriteLine($"平均值{fiftyElementArray.Average()}");
            Console.WriteLine($"最小值{fiftyElementArray.Min()}");
            Console.WriteLine($"最大值{fiftyElementArray.Max()}");
            Console.WriteLine($"总和{fiftyElementArray.Sum()}");
            Console.ReadLine();
        }

    }
}

示例解释:

        创建了一个包含 1 到 50 的整数数组,并使用 LINQ 的聚合函数计算了各种统计信息。当你运行这段代码时,它会输出数组的元素个数、平均值、最小值、最大值和总和。 

七、单值选择查询

单值查询顾名思义就是返回结果不返回重复的值。

举个例子:

using System;
using System.Linq;
namespace My
{
    class Program
    {
        static void Main()
        {
            Student[] students = {
            new Student { ClassID = 10, Name = "张三" },
            new Student { ClassID = 10, Name = "李四" },
            new Student { ClassID = 11, Name = "王五" },
            new Student { ClassID = 11, Name = "赵六" },
            new Student { ClassID = 12, Name = "钱七" }
        };
            var student = (from m in students select m.ClassID).Distinct();
            foreach (var item in student)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }
        class Student
        {
            public string Name { get; set; }
            public int ClassID { get; set; }
        }
    }
}

示例解释:

         使用 LINQ 查询语法从学生数组中选择每个学生的 ClassID 属性,并使用 Distinct() 方法获取不重复的 ClassID 值,然后在控制台输出这些值。Distinct() 方法是 LINQ 提供的一个方法,用于在序列中筛选出不重复的元素,即返回序列中唯一的元素。当然您也可以使用扩展方法Select 。举个例子:var student = students.Select(m=> m.ClassID).Distinct();

八、多级排序

        多级排序指的是按照多个条件进行排序。通过LINQ查询表达式和orderby关键字可以轻松实现多级排序

举个例子:

using System;
using System.Collections.Generic;
using System.Linq;
namespace My
{
    class Program
    {
        static void Main()
        {
            List<Person> people = new List<Person>
            {
            new Person("Alice", 25),
            new Person("Bob", 30),
            new Person("Charlie", 35),
            new Person("David", 40),
            new Person("Eve", 45)
            };

            //按年龄排序后按姓名长度降序排序
           var LL= from o in people orderby o.Age  orderby o.Name.Length descending select o;
            foreach(Person o in LL)
            {
                Console.WriteLine(o.Name);
            }
            Console.ReadLine();
        }

    }
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
}

示例解释:

        使用LINQ进行多级排序的示例。我创建了一个List<Person>对象,并使用LINQ进行排序操作。首先按照年龄升序排序,然后在年龄相同时按照姓名长度降序排序。最后,使用循环遍历排序后的结果,并输出每个人的姓名。

九、分组查询

using System.Collections.Generic;
using System.Linq;
namespace My
{
    class Program
    {
        static void Main()
        {
            List<Student> students = new List<Student>
            {
            new Student { Name = "Alice", Age = 18 },
            new Student { Name = "Bob", Age = 20 },
            new Student { Name = "Charlie", Age = 18 },
            new Student { Name = "David", Age = 19 },
            new Student { Name = "Eve", Age = 20 },
            new Student { Name = "Eve", Age = 40 }
            };

            //按照名称分组
            // var temp = from student in students group student by student.Name;

            //按照年龄对学生进行分组,并按照分组后的平均年龄进行排序。
            var temp2 = 
                from student in students 
                group student by student.Age into AGe 
                select new { AvgAge = AGe.Average(n => n.Age), AGe.Key };
            
            var temp3 = from student in temp2 orderby student.AvgAge select student;

        }

    }
    class Student
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

示例解释:

        当前代码 temp2  这段赋值代码的意思是,LINQ对students数组进行操作,group student  是对当前对象进行分组操作 by student.Age 对当前student.Age 的值来进行分组 into AGe 是返回一个新的结果集,然后对这个新的结果集 创建了一个匿名对象new { AvgAge = AGe.Average(n => n.Age), AGe.Key };我们之前的写法都是返回当前的结果集,但我们这里创建了一个匿名对象 对象中有两个值 一个值是计算当前结果集的平均值n => n.Age是值具体计算的平均值成员,然后赋值给匿名类型AvgAge  ,这个匿名对象的第一个值,第二个值是当前的键,也就是可以理解为分组的的组名,最后返回给Temp2。temp3 则是对temp2的结果中的平均值进行一个升序排序。

数据最后效果:

十、Join查询

可以用一个查询将两个集合当中的相同数据 用关键字进行连接。

举个例子:

using System;
using System.Collections.Generic;
using System.Linq;

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Person2
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "张三", Age = 30 },
            new Person { Name = "李四", Age = 25 },
            new Person { Name = "老六", Age = 35 }
        };

        List<Person2> people2 = new List<Person2>
        {
            new Person2 { Name = "张三三", Age = 30 },
            new Person2 { Name = "李四四", Age = 25 },
            new Person2 { Name = "老六六", Age = 35 }
        };

        var Temp = from p in people join o in people2 on p.Age equals o.Age select new { BigName = p.Name, SmallName = o.Name, p.Age }; 

        foreach (var result in Temp)
        {
            Console.WriteLine(result);
        }

        Console.ReadLine();
    }
}

示例解释:

        使用LINQ查询语法进行连接操作,并选择一些属性进行输出。

var Temp = 
    from p in people join o in people2 on p.Age equals o.Age 
    select new { BigName = p.Name, SmallName = o.Name, p.Age }; 

        在peoplepets这两个对象列表之间,通过比较Person类的Age属性和Pet类的Age属性,找到相等的项,并将Person类的Name属性、Pet类的Name属性以及Person类的Age属性作为结果进行输出。

执行效果:

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

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

相关文章

上海亚商投顾:沪指冲高回落 游戏股午后集体重挫

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数12月22日冲高回落&#xff0c;黄白二线分化严重。游戏股午后大跌&#xff0c;盛天网络、游族网络、巨…

【JAVA】黑马MybatisPlus 学习笔记【终】【插件功能】

4.插件功能 MybatisPlus提供了很多的插件功能&#xff0c;进一步拓展其功能。目前已有的插件有&#xff1a; PaginationInnerInterceptor&#xff1a;自动分页TenantLineInnerInterceptor&#xff1a;多租户DynamicTableNameInnerInterceptor&#xff1a;动态表名OptimisticL…

bootstrap:bootstrapValidator校验数据是否可用(验证账户名是否重复)

目录 1、html内容 2、bootstrap的校验 3、控制层代码&#xff1a; 4、业务层核心代码 5、效果 1、html内容 <form id"jangleEditForm" name"jangleEditForm" class"formJ" ><div class"form-group" ><label for&q…

10个练习Web渗透测试的最佳网站

黑客的最高境界——社会工程学&#xff01;社会工程在网络安全领域充当了关键角色&#xff01;黑客技术如何操纵信息安全&#xff1f;社会工程攻击的多种形式&#xff0c;包括网络钓鱼、电子邮件欺诈、诱饵场景&#xff1b;如何应对黑客利用未提出的问题的策略。防范黑客社会工…

二叉树OJ题——3.翻转二叉树

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 翻转每一棵树的左右子树根节点 */void swap (struct TreeNode**x,struct TreeNode**y) {struct TreeNode*num0;num*x;*x*y;*ynum; }struct TreeNode* invertTree(struct TreeNode* root) { i…

【广州华锐互动】VR科技科普展厅平台:快速、便捷地创建出属于自己的虚拟展馆

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已经在许多领域取得了显著的成果。尤其是在展馆设计领域&#xff0c;VR科技科普展厅平台已经实现了许多令人瞩目的新突破。 VR科技科普展厅平台是广州华锐互动专门为企业和机构提供虚拟展馆设计和制作的在线平台。通过这个平台&…

二分查找——OJ题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、点名1、题目讲解2、算法原理3、代码实现 二、搜索旋转排序数组中的最⼩值1、题目讲解2、算…

LabVIEW在齿轮箱故障诊断中的应用

LabVIEW在齿轮箱故障诊断中的应用 在现代机械工业中&#xff0c;齿轮箱作为重要的传动设备&#xff0c;其性能稳定性对整体机械系统的运行至关重要。故障的及时诊断和处理不仅保障了设备的稳定运行&#xff0c;还减少了维护成本。利用LabVIEW强大数据处理和仿真能力&#xff0…

在k8s中将gitlab-runner的运行pod调度到指定节点

本篇和前面的 基于helm的方式在k8s集群中部署gitlab 具有很强的关联性&#xff0c;因此如果有不明白的地方可以查看往期分享&#xff1a; 基于helm的方式在k8s集群中部署gitlab - 部署基于helm的方式在k8s集群中部署gitlab - 备份恢复基于helm的方式在k8s集群中部署gitlab - 升…

(11)Linux 进程以及进程控制块PCB

前言&#xff1a;章我们将带着大家深入理解 "进程" 的概念&#xff0c;"进程" 这个概念其实使我们一直在接触&#xff0c;只不过这个概念我们没有进行详细讲解罢了&#xff0c;本章我们就把 "进程" 好好地深入理解一番&#xff01;引出进程的概念…

C语言结构体内存对齐

文章目录 一、结构体内存对齐问题二、查看结构体成员起始位置三、设置内存对齐方式 一、结构体内存对齐问题 如下的info_s结构体类型&#xff0c;包含一个int型成员age, 一个char型成员gender, 一个int型成员id。 单从数据成员的大小进行分析&#xff0c;整个结构体的大小应为…

Spring Boot国际化i18n配置指南

Spring Boot国际化i18n配置指南 一、配置 1、yml文件配置 spring:messages:basename: i18n/Messages,i18n/Messages_en_US,i18n/Messages_zh_CNencoding: UTF-8i18n&#xff1a;表示国际化文件的父目录 Messages&#xff1a;默认国际化文件 Messages_en_US&#xff1a;英文文…

共享和独享的区别是什么?有必要用独享IP吗?

通俗地讲&#xff0c;共享IP就像乘坐公共汽车一样&#xff0c;您可以到达目的地&#xff0c;但将与其他乘客共享旅程&#xff0c;座位很可能是没有的。独享IP就像坐出租车一样&#xff0c;您可以更快到达目的地&#xff0c;由于车上只有您一个人&#xff0c;座位是您一个人专用…

链表的详细介绍

目录 链表的简单定义&#xff1a; 链表的分类 单项带头非循环 单向不带头循环链表 实现单向非循环无头链表 定义链表&#xff1a; 实现链表方法 打印链表 头插法&#xff1a; 尾插法&#xff1a; 指定插入&#xff1a; 通过对应值删除节点&#xff1a; 删除所有对应…

Unity向Web服务器上传和下载图片

Unity向Web服务器上传和下载图片 如果本片有看不懂的请查看我上篇文章&#xff1a;[Unity与Web服务器Post&#xff0c;Get](https://blog.csdn.net/qq_42194657/article/details/103031573)一、上传和下载图片1.在Unity中创建一个RawImage并在WebManager.cs脚本中添加一个Textu…

.json文件转为.dll文件后还能读取吗?

(只是修改了后缀名而已&#xff0c;做一个伪装&#xff09; 测试&#xff1a; QFile file(QApplication::applicationDirPath() "/config.dll");qDebug()<<QApplication::applicationDirPath() "/config.dll";if (file.open(QIODevice::ReadOnly))…

css mask 案例

文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩&#xff0c;可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性&#xff0c;可以创建独特的效果&#xff0c;比如圆形、渐变…

西门子博途怎么使用PID_Compact做pid调试

到目前为止&#xff0c;我已经在S7-1200中创建了一个可运行的PLC程序&#xff0c;并在Basic Panel中创建了一个HMI项目来操纵和操作该程序。 引文&#xff1a;博途工控人平时在哪里技术交流博途工控人社群 现在&#xff0c;我们该如何深入的让程序开始逐渐智能化呢&#xff0c…

少儿编程加盟培训机构管理系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着少儿编程教育的快速发展&#xff0c;加盟培训机构的数量不断增加。为了更好地管理学员信息、课程安排、教师工资等&#xff0c;需要开发一款少儿编程加盟培训机构管理系统源码。 &#xff08;二&#xff09;项目…

Nginx快速入门:实现企业安全防护|nginx部署https,ssl证书(七)

0. 引言 之前我们讲到nginx的一大核心作用就是实现企业安全防护&#xff0c;而实现安全防护的原理就是通过部署https证书&#xff0c;以此实现参数加密访问&#xff0c;从而加强企业网站的安全能力。 nginx作为各类服务的统一入口&#xff0c;只需要在入口处部署一个证书&…