C# Linq 详解一

news2024/11/26 8:40:13

目录

一、概述

二、Where

三、Select

四、GroupBy

五、First / FirstOrDefault

六、Last / LastOrDefault​​​​​​​


一、概述

语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。 此外,需要针对每种类型的数据源了解不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。 借助 LINQ,查询成为了最高级的语言构造,就像类、方法和事件一样。

对于编写查询的开发者来说,LINQ 最明显的“语言集成”部分就是查询表达式。 查询表达式采用声明性查询语法编写而成。 使用查询语法,可以用最少的代码对数据源执行筛选、排序和分组操作。 可使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO .NET 数据集、XML 文档和流以及 .NET 集合中的数据。

二、Where

Where 是 LINQ 的一个操作符,用于筛选满足指定条件的元素。

说白了就是查找元素,这个在 C# 的开发中也是比较常用的,下面看一个例子

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> numList = new List<int> { 1, 4, 5, 24, 43, 67, 12, 90, 15 };
            IEnumerable<int> collect = numList.Where(x => x > 20);
            foreach (int num in collect)
            {
                Console.WriteLine(num);
            }

            Console.ReadKey();
        }
    }
}

运行:

在 where 中,x 所代表的就是 numList 中的每一个元素,Where(x => x > 20) 所指的就是遍历 numList 每一个元素,如果它大于20,那么就添加到 IEnumerable<int> 中,一般情况下,为了让代码更优雅些,IEnumerable<int> 可以不写,直接用 var 代替,当然,你也可以写的更清楚一些,这都是没关系的。

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> numList = new List<int> { 1, 4, 5, 24, 43, 67, 12, 90, 15 };
            var collect = numList.Where(x => x > 20);
            foreach (int num in collect)
            {
                Console.WriteLine(num);
            }

            Console.ReadKey();
        }
    }
}

另外,在 Where 后面可以继续写其他的条件也是没问题的,因为当前的类型本来就是 IEnumerable 类型,它和 List 等数据结构是一样的,都可以使用 Linq 继续操作,下面就是在  Where 后面又加了一个 Where,这么写也是不会报错的,但是不建议这么写,最好是在后面加其他的查询条件,比如 Select

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> numList = new List<int> { 1, 4, 5, 24, 43, 67, 12, 90, 15 };
            var collect = numList.Where(x => x > 20).Where(x => x > 30);
            foreach (int num in collect)
            {
                Console.WriteLine(num);
            }

            Console.ReadKey();
        }
    }
}

运行:

在 Where 的判断条件中,你就当它和 if 中的判断条件一样写,多写几个判断条件也是可以的

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> numList = new List<int> { 1, 4, 5, 24, 43, 67, 12, 90, 15 };
            var collect = numList.Where(x => x > 10 && x < 90);
            foreach (int num in collect)
            {
                Console.WriteLine(num);
            }

            Console.ReadKey();
        }
    }
}

运行:

有人可能会问:“不对啊,我在网上查资料中,和你写的不一样,他们写的有 from, in 等关键字,你这为啥没有啊,你这 Linq 是不是搞错了”?没搞错哈,这都是正常的,比如下面的代码,虽然写法不一样,但效果是一样的,我更推荐使用上面的写法,更容易理解,阅读起来也更加方便。

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> numList = new List<int> { 1, 4, 5, 24, 43, 67, 12, 90, 15 };

            //var collect = numList.Where(x => x > 10 && x < 90);

            var collect = from x in numList where x > 10 && x < 90 select x;
            foreach (int num in collect)
            {
                Console.WriteLine(num);
            }

            Console.ReadKey();
        }
    }
}

运行:

三、Select

Select 是 LINQ 的一个操作符,用于对序列中的每个元素进行转换或投影操作,并返回一个新的序列。

使用 Select 可以对数组中的每个元素进行转换,或者计算,下面用一个简单的例子,将数组中每个元素 + 1

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> numList = new List<int> { 1, 4, 5, 24, 43, 67, 12, 90, 15 };
            var collect = numList.Select(x => x + 1);
            foreach (var x in collect)
            {
                Console.WriteLine(x);
            }

            Console.ReadKey();
        }
    }
}

运行:

同样的,在 Select 执行结束后,依然可以添加其他的 Linq 操作,这个在 Linq 查询中基本都是一样的,后面就不再赘述了。

四、GroupBy

Linq GroupBy 方法用于按照指定的键对集合进行分组,它返回一个根据指定键进行分组的结果集。

先看一段代码,演示 GroupBy 方法 是如何进行分组的

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<People> peopleList = new List<People>()
            {
                new People(){Name="张三", Age=12, Career="学生" },
                new People(){Name="柱子", Age=25, Career="农民" },
                new People(){Name="铁蛋", Age=23, Career="农民" },
                new People(){Name="狗剩", Age=34, Career="职员" },
                new People(){Name="二狗", Age=28, Career="职员" },
            };

            var collect = peopleList.GroupBy(x=> x.Career == "职员");
            foreach (var group in collect)
            {
                Console.WriteLine("Grade {0}:", group.Key);
                foreach (var people in group)
                {
                    Console.WriteLine(people.Name);
                }
            }

            Console.ReadKey();
        }
    }

    class People
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Career { get; set; }
    }
}

结果: 

运行后可以看到,返回的是两组数据,grade 等于 false 是不满足条件的数据,也一并返回了

grade 等于 true 的正是我们想要的数据

五、First / FirstOrDefault

First 方法用于返回集合中的第一个元素。如果集合为空,则会引发一个异常。如果你想要安全地获取第一个元素,可以使用 FirstOrDefault 方法,它会返回默认值(null或0,具体取决于元素类型)而不是引发异常。

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> numList = new List<int> { 1, 4, 5, 24, 43, 67, 12, 90, 15 };
            int firstNumber = numList.First();
            Console.WriteLine("第一个元素:{0}", firstNumber);

            int defaultNumber = numList.FirstOrDefault();
            Console.WriteLine("第一个元素:{0}", defaultNumber);

            int[] emptyNumbers = { };
            int firstOrDefaultNumber = emptyNumbers.FirstOrDefault();
            Console.WriteLine("第一个元素:{0}", firstOrDefaultNumber);

            Console.ReadKey();
        }
    }
}

运行:

六、Last / LastOrDefault

Last 方法用于返回集合中的最后一个元素。如果集合为空,则会引发一个异常。如果你想要安全地获取最后一个元素,可以使用 LastOrDefault 方法,它会返回默认值(null或0,具体取决于元素类型)而不是引发异常。

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<int> numList = new List<int> { 1, 4, 5, 24, 43, 67, 12, 90, 15 };
            int firstNumber = numList.Last();
            Console.WriteLine("最后一个元素:{0}", firstNumber);

            int defaultNumber = numList.LastOrDefault();
            Console.WriteLine("最后一个元素:{0}", defaultNumber);

            int[] emptyNumbers = { };
            int firstOrDefaultNumber = emptyNumbers.LastOrDefault();
            Console.WriteLine("最后一个元素:{0}", firstOrDefaultNumber);

            Console.ReadKey();
        }
    }
}

运行:

end

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

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

相关文章

Exceptional C++读书笔记——泛型程序设计与C++标准库

更新中——上次更新&#xff08;2023.07.13-23:07&#xff09; 迭代器&#xff08;iterator&#xff09; #include <iostream> #include <vector> #include <iterator> #include <algorithm>int main() { std::vector<int> e; std::copy(…

第二章编程模型(Cortex-M7 Processor Programmers Model)

第二章编程模型 本章描述了程序员模型。它包含以下部分: 关于2-2页的程序员模型。2-3页的操作和执行方式。指令集摘要见第2-4页。系统地址映射在2-5页。2-8页的独家监视器。处理器核心寄存器在第2-9页。例外情况见第2-10页。 2.1关于编程模型 本章概述了描述实现定义选项的…

力扣题目解析:生成奇数个字符的字符串的巧妙方法

本篇博客会讲解力扣“1374. 生成每种字符都是奇数个的字符串”的解题思路&#xff0c;这是题目链接。 这道题的解题思路很巧妙&#xff0c;它利用了字符串长度n的奇偶性&#xff1a; 如果n是奇数&#xff0c;那么就把字符串全部填充为’a’&#xff0c;这样每种字符都是奇数个…

posix ipc之共享内存

note 1.shm_open的pathname不能带路径名&#xff0c;shm_open的创建目录为/dev/shm 2.使用ftruncate设置内核共享内存实例的大小 3.使用mmap进行有名映射(实例反应在文件系统的一个文件) code #include <sys/mman.h> #include <sys/stat.h> #include <fcntl…

【动手学习深度学习--逐行代码解析合集】16深度卷积神经网络(AlexNet)

【动手学习深度学习】逐行代码解析合集 16深度卷积神经网络&#xff08;AlexNet&#xff09; 视频链接&#xff1a;动手学习深度学习–深度卷积神经网络&#xff08;AlexNet&#xff09; 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2…

网络安全与防范

1.重要性 随着互联网的发达&#xff0c;各种WEB应用也变得越来越复杂&#xff0c;满足了用户的各种需求&#xff0c;但是随之而来的就是各种网络安全的问题。了解常见的前端攻击形式和保护我们的网站不受攻击是我们每个优秀fronter必备的技能。 2.分类 XSS攻击CSRF攻击网络劫…

瑞萨RFP工具使用问题总结

最近在用瑞萨的RH850&#xff0c;需要用到瑞萨提供的刷新工具RFP&#xff08;Renesas Flash Programmer&#xff09;&#xff0c;但是总是遇到一些问题&#xff0c;除了一些能够在官网上找到答案的问题&#xff0c;还遇到了其他各种各样的问题&#xff0c;这里记录一下问题和对…

【问题分析解决】git添加.gitignore后不生效问题

一&#xff0c;问题现象 在已经提交过的git管理的项目中&#xff0c;新增加一个.gitignore文件&#xff0c;或者修改.gitignore文件之后&#xff0c;新增的内容不生效。 二&#xff0c;问题原因 因为我们误解了.gitignore文件的用途&#xff0c;该文件只能作用于Untracked F…

AI图像生成无需API开发连接集简云数据表,实现生成图片自动同步能力

1 场景描述 人工智能的出现&#xff0c;各个领域都开始尝试将AI作为提高工作效率的必备工具。除了AI对话等&#xff0c;越来越多的AI图像生成工具也出现在市场上。这些AI图像生成工具可以自动创建惊人的图像、艺术作品和设计&#xff0c;从而帮助设计师和创意人员更快速地实现其…

工业交换机网管运维方案

工业交换机设备商对网管的需求 对工业交换机设备提供商来说&#xff0c;如下几个因素都是需要面对的&#xff1a; 最终客户的需要&#xff1a; 网络和工业交换机设备的可管理性&#xff0c;已经被越来越多的最终用户所重视&#xff0c;在设备采购中&#xff0c;多数时候甚至是…

电脑内存错误怎么办?

内存是电脑的基本配件之一&#xff0c;一款电脑的内存大小能够在一定程度上决定这款电脑的性能。我们在使用电脑的过程中总会出现一些关于内存大大小小的问题&#xff0c;其中电脑提示内存错误的原因是什么?电脑内存错误怎么解决呢? 内存错误的原因 电脑的很多故障往往都会反…

面试题更新之-本地存储是什么?

文章目录 本地存储是什么Cookiesjs中如何使用Cookies localStoragejs中如何使用localStorage sessionStoragejs中如何使用sessionStorage 本地存储是什么 本地存储是指将数据保存在用户的本地设备上&#xff0c;以供后续使用和访问。通过本地存储&#xff0c;网页和应用程序可…

Day2 图连通

A - PRO-Professor Szu 简单的来说就是 缩点、反图拓扑。 需要注意不与 n 1 n1 n1 联通的点可能会使得一些点的入度无法为 0 而无法入队&#xff0c;消除这些点的影响即可。 当时写的&#xff1a; D - BLO-Blockade 非割点&#xff1a; 2 ( n − 1 ) 2(n-1) 2(n−1)。 …

【环信集成教程】环信的那些”已读“功能实现及问题解决

写在前面 在调用环信的消息回执时&#xff0c;是否有以下的烦恼 1、发送了消息已读回执&#xff0c;为什么消息列表页的未读数没有发生变化&#xff1f; 2、发送了消息已读回执&#xff0c;为什么消息漫游拉取不到已读状态&#xff1f; 如果你有这些烦恼&#xff0c;那就继续…

大量SDK设备接入时,如何巧妙配置EasyCVR平台参数?

EasyCVR视频融合平台可支持海量视频的轻量化接入与汇聚管理。在视频能力上&#xff0c;EasyCVR可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。平台支持多协议接入&#xff0c;包括国标GB28181、RTMP、RTSP/Onvif、海…

【QT/OpenCV】QT实现张正友相机标定

相机标定 01、相机标定02、OpenCV函数及其张正友标定法2.1、相机标定步骤2.2、相机标定相关函数2.2.1 提取角点--- findChessboardCorners2.2.2 亚像素角点提取1--- find4QuadCornerSubpix2.2.3 亚像素角点提取2--- cornerSubPix2.2.4 绘制内角点 --- drawChessboardCorners2.2…

操作系统复习(非抢占式的优先数调度算法)

今天在写题目的时候遇到了一个问题&#xff0c;在非抢占式的优先数调度算法中&#xff0c;存在一种情况。优先级相同&#xff0c;并且同时到达&#xff0c;这种情况下&#xff0c;短作业优先。例如&#xff1a; 这种情况下&#xff0c;调度顺序为&#xff1a;P1、P2、P4、P3。

终极实时测试工具:NCrunch 4.17 for vs19-22 Crack

适用于 .NET 的终极实时测试工具 在编码时以内联方式查看实时测试结果和指标。 Visual Studio 的自动并发测试 NCrunch 是一个全自动测试扩展&#xff0c;旨在使编码和测试变得轻而易举。 忘记停下来运行测试&#xff0c;让 NCrunch 为您完成工作。 以您认为的速度编码和测试…

记录一个AFR去嵌S参数异常的案例。

最近在使用AFR去嵌一个S参数的时候&#xff0c;遇到了如下问题&#xff1a; 首先介绍一下这个S参数&#xff0c;一端是MCIO连接器&#xff0c;另一端是CEM连接器&#xff0c;所以测试的时候一端接MCIO测试治具&#xff0c;一端接CEM测试治具&#xff0c;再通过线缆将测试治具连…

c++--继承

1.什么是继承 C有面向对象三大特性&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff0c;封装。而继承就是代码可以复用的重要手段。他可以让程序员在原有类的基础上进行扩展&#xff0c;增加功能&#xff0c;产生新的类&#xff0c;称为子类或派生类&#xff0c;继承…