C#学习笔记 LINQ简单使用

2023-10-30

LINQ是C#中的一项非常好用的功能,全程是语言集成查询Language Integrated Query。LING和SQL类似,但是不仅可以查询数据库中的数据,还可以查询文件、XML、对象集合等等。要使用LINQ特性,需要引用System.Linq命名空间。

使用LINQ时,需要有一个数据源充当被查询的对象,然后需要编写LINQ查询语句,然后就是执行查询。其中数据源必须实现IEnumberable<T>接口。可以用一个简单的例子验证一下。

            List<int> array = new List<int> { 1, 2, 3, 4, 5 };
            var greatThan3 =
                from a in array
                where a > 3
                select a;
            foreach (var i in greatThan3)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();

需要注意的是,LINQ默认采用延迟查询的方式,在遇到LINQ查询语句的时候,只是会保存查询方法,真正执行查询的是在后面迭代结果集的时候。这样做的好处是结果会受到数据源的影响,因此查询出来的结果一直是最新的。有时候需要强制执行查询。这时候可以对查询变量执行ToList()或者ToArray()方法,这样就会立即执行并返回查询结果。

            List<int> array = new List<int> { 1, 2, 3, 4, 5 };
            var greatThan3 =
                (from a in array
                where a > 3
                select a).ToArray();
            foreach (var i in greatThan3)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();

from字句引入范围变量,这个范围变量可以在LINQ查询语句中使用,还可以用多个from引入多个数据源或者执行嵌套查询。in字句引入数据源。如果数据源没有实现泛型的IEnumberable<T>接口,那么就必须在from字句中显式添加类型名来强类型化数据源中的变量。select字句用于选择查询结果,查询结果既可以是查询表达式签名出现过的某一范围变量的计算结果,也可以是一个临时指定的匿名类型。一个查询表达式必须以select子句或者group子句结束。where子句用来筛选数据源中的数据。在一个查询表达式中可以指定多个where子句,而在一个where子句中又可以指定多个谓词。谓词就是返回值为布尔类型的表达式或者语句。如果一个where子句中有多个谓词的话,应该使用||或者&&进行分隔。

排序和分组

排序使用orderby关键字,后面跟要排序的字段和排序类型,默认是升序ascending,所以一般指定指定的都是降序desending。当对多个字段进行主次要排序的时候,可以用逗号分隔多个字段。
            int[] array = { 1, 2, 3, 100, 7, 9, 5, 10, 22, 4, 5 };
            var result = from a in array
                         where a > 3 && a % 2 == 0
                         orderby a descending
                         select a;


分组使用order by关键字,order后面是要分组的字段,by后面是要按什么来分组。用循环访问这样的结果时,需要嵌套的foreach循环,外层用户访问结果中不同的组,内层访问同组中不同的结果。这个示例返回了按奇偶数分组的查询。
            int[] array = { 1, 2, 3, 4, 5, 6, 7 };
            var result = from a in array
                         group a by a % 2;
            foreach (var group in result)
            {
                foreach (var g in group)
                    Console.Write(g + " ");
                Console.WriteLine();
            }
还可以对分组之后的组名进行查询,这时候需要into关键字指定组名。以下返回了按奇偶分组中组中元素个数大于3的查询结果。
            var result2 = from a in array
                          group a by a % 2 into aGroup
                          where aGroup.Count() > 3
                          select aGroup;

投影

利用select子句不仅可以返回某个范围变量,还可以创造新的变量,这就是投影。投影可以只取某个类或者某几个类的字段,还可以将几个字段拼接成一个匿名类。下面是一个将两组数字按二倍数的关系投影成一个匿名类。
            int[] array1 = { 1, 2, 3, 4, 5 };
            int[] array2 = { 2, 4, 6, 8, 10 };
            var result = from a1 in array1
                         from a2 in array2
                         where a1 * 2 == a2
                         select new { a = a1, b = a2 };




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#学习笔记 LINQ简单使用 的相关文章

  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 蓝桥杯2021省赛填空题最后一题:图的遍历和最大公因数(小蓝的图由 2021 个结点组成,依次编号 1 至 2021。)

    蓝桥杯2021省赛填空题最后一题 小蓝的图由 2021 个结点组成 依次编号 1 至 2021 对于两个不同的结点 a b 如果 a 和 b 的差的绝对值大于 21 则两个结点 之间没有边相连 如果 a 和 b 的差的绝对值小于等于 21
  • 浅显易懂 SQLite3 笔记(05)— 搭建Windows下的QT数据库(SQLite3)环境

    文章目录 前言 一 配置文件 二 环境搭建 三 环境测试 总结 前言 在学习完SQLite3数据库基本表的增删改查后 本篇我们将开始搭建Windows操作系统下的QT数据库环境 使QT中的数据来源从C 容器转移到数据库中 完成软件界面与数据
  • iOS appid (wildcard ID和explicit ID)

    最近做ios游戏的平台相关的工作 平台商要求把我们产品的bundle id加上他们的标记 比如我们的bundle id叫 com lc test 如果我上CSDN的平台 就需要改成 com lc testCSDN之类的 作为一个不是做ios
  • 用MATLAB写出蒙特卡洛仿真

    蒙特卡洛仿真是一种在计算机上模拟随机过程的方法 在 MATLAB 中 可以使用函数 rand 来生成随机数 并用循环语句进行模拟 下面是一个简单的例子 模拟在半径为 1 的圆内随机生成点 并统计在圆内的点的数量 设置随机点的数量n 1000
  • 如何提高工作激情,打造狼性团队

    一 榜样激励 为员工树立一根行为标杆 在任何一个组织里 管理者都是下属的镜子 可以说 只要看一看这个组织的管理者是如何对待工作的 就可以了解整个 组织成员的工作态度 表不正 不可求直影 要让员工充满激情地去工作 管理者就先要做出一个样子来
  • csharp: Export or Import excel using NPOI

    excel 2003 using System using System Collections Generic using System ComponentModel using System Data using System Draw
  • 网络安全人才的发展情况是怎么样的呢?快上车,带你了解

    前言 根据报告执行的数据分析情况 今年因疫情影响及新基建的提出 导致网络安全人才的择业及网络安全从业人员的流动受到一些影响 目前网络安全人才培养方面存在以下几个主要特点 1 在校网络安全人才中性别比例愈加趋于均衡 网络安全学生中女性占比连续
  • 【MySQL】数据库主主备份

    我们先以A服务器为起点 配置它的数据库同步到B 这就是主 从复制了 之后再反过来做一次 就可以互相备份了 热备份的条件 1 mysql的版本都要高于3 2 2 两者数据库版本相同 3 主主备份相当于在原先主从备份的基础上反过来再操作一次 范
  • 算法的鲁棒性

    在机器学习领域 总是看到 算法的鲁棒性 这类字眼 比如这句 L1范数比L2范数鲁棒 鲁棒 的英文是robustness 其是一个特别大的研究领域 最权威的著作当属稳健统计的2本厚书 文献 1 和 2 有志之士可作研究 本人的硕士论文对算法鲁
  • 存储显示联机服务器,存储和服务器如何连接

    存储和服务器如何连接 内容精选 换一换 通过内网连接云手机实例时 需要在租户VPC中创建一台弹性云服务器 作为连接云手机的跳板机器 若创建云手机服务器时未使用自定义网络 还需在云手机租户的VPC和服务器所在VPC之间建立对等连接 如图1所示
  • E70_433半双工无线模组,伪全双工方案

    E70 433半双工无线模组 伪全双工方案 前言 架构设计 外侧输入模块 外侧输出模块 内侧发帧模块 内侧接受模块 实现代码 通用宏定义 代码解析 通用工具函数 代码解析 串口输入输出函数 代码解析 核心业务代码 发送模块 代码解析 接收模
  • uint8 int8

    signed char int8 unsigned char uint8 int int16 unsigned int uint16 long int32 unsigned long uint32 long long int64 unsig
  • python设计个性签名

    python设计个性签名 1 设计个性签名即根据输入的汉字 在签名网站上爬取相应的签名并可视化输出设计结果 2 签名展示举例 可根据需要自行修改 潇洒签 代码展示 import tkinter from tkinter import fro
  • 用python写一个简单的对话框

    前几天 同事说他学过C 做对话框 然后他问我可不可以用python写个对话框 今天我就来写个python的简单版本对话框 大家都是成年人且单身 那么就来写个相亲的对话框 import time print 快过年了 相亲队伍火热报名中 ti
  • Charles 下载并激活(现在已经不用下载Jar包了)。完美解决

    Charles下载网址 https www charlesproxy com download 1 Charles先下载 安装 2 安装完成之后 https www zzzmode com mytools charles 输入任意名字 点击
  • Hadoop Hive sql语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统 它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据 可以将结构 化的数据文件映射为一张数据库表 并提供完整的SQL查询功能 可以将SQL语句转换为MapRe
  • 简单案例分析

    今天做了几个案例 我不太会 还有人说我笨 还说我逻辑思维有问题 其实我感觉也是 他说的对 我就是有点笨 逻辑还跟不上 我希望多对别人宽容与帮助 多给那些原本就不太会的同学一些鼓励 案例1 设计并实现打印一个四位数的逆序数的程序 例如 123
  • 计算日期间隔的巧妙代码C++

    int Date daysTo int year int month int day int y1 m1 d1 int y2 m2 d2 m1 m 9 12 y1 y m1 10 d1 365 y1 y1 4 y1 100 y1 400 m
  • oracle-超全的多表查询连接

    Oracle 聚合函数 Oracle 日期 时间函数 一 简述 1 两个表的连接 是通过将一个表中的一列或者多列同另一个表中的列连接而建立起来的 用来连接两张表的表达式组成了连接条件 当连接成功后 第二张表中的数据就同第一张表连接起来了 并
  • C#学习笔记 LINQ简单使用

    LINQ是C 中的一项非常好用的功能 全程是语言集成查询Language Integrated Query LING和SQL类似 但是不仅可以查询数据库中的数据 还可以查询文件 XML 对象集合等等 要使用LINQ特性 需要引用System