当前位置: 首页 > news >正文

【.NET Core】Linq查询运算符(一)

【.NET Core】Linq查询运算符(一)

文章目录

  • 【.NET Core】Linq查询运算符(一)
    • 一、概述
    • 二、筛选数据
    • 三、投影运算
        • 3.1 Select
      • 3.2 SelectMany
      • 3.3 Zip
      • 3.4 Select 与 SelectMany
    • 四、Set(设置)运算
      • 4.1 Distinct或DistinctBy
      • 4.2 Except或ExceptBy
      • 4.3 Intersect或IntersectBy
      • 4.4 Union或UnionBy
    • 五、对数据进行排序
      • 5.1 OrderBy
      • 5.2 OrderByDescending
      • 5.3 ThenBy
      • 5.4 ThenByDescending
      • 5.5 Reverse()
    • 六、限定符运算
      • 6.1 All
      • 6.2 Any
      • 6.2 Contains
    • 七、数据分区
      • 7.1 Skip
      • 7.2 SkipWhile
      • 7.3 Take
      • 7.4 TakeWhile
      • 7.5 Chunk

一、概述

查询运算符是组成Linq模式的方法。这些方法中的大多数都作用于序列;其中序列指其类型实现IEnumberable<T>接口或IQueryable<T>接口的对象。标准查询运算符提供包括筛选、投影、集合、排序等查询功能。

查询运算符包含两组,一组作用于类型IEnumberable<T>的对象,另一组作用于类型IQueryable<T>的对象。

二、筛选数据

筛选是指将结果集限制为仅包含满足指定条件的元素的操作。它也称为选定内容。筛选数据方法包含OfType和Where。

string[] list=["A","AB","BC","CD","DE","EF"];
IEnumerable<string> query = from chars in list where chars.Contains("B") select chars;
foreach(string ch in query){Console.WriteLine(str);
}

运行结果:

AB
BC

三、投影运算

投影是指将对象转换为一种新形式的操作,该形式通常只包含那些将随后使用的属性。通过使用投影,可以构造从每个对象生成的新类型。可以投影属性,并对属性执行数学函数。

3.1 Select
string[] list={"A","AB","BC","CD","DE","EF"};
IEnumerable<string> query = from chars in list select chars.ToLower();
foreach(string ch in query){Console.WriteLine(str)
}

运行结果

a
ab
bc
cd
de
ef

3.2 SelectMany

使用多个from子句来投影字符串列表中每个字符串的每个字符转变为大写。

string[] list =  { "A|B|C|D","E|F|G|H"};
IEnumerable<string> query = from chars in list from ch in chars.Split('|')select ch;
foreach (string ch in query)
{Console.WriteLine(ch)     
}

运行结果

A
B
C
D
E
F
G
H

3.3 Zip

Zip投影运算符有多个重载,所有Zip方法都处理两个或更多可能是异构类型的序列。前两个重载返回元组,具有来自给定序列的响应位置类型。

int[] index = { 1, 2, 3 };
string[] chars = { "A", "B", "C" };
IEnumerable<string> zip = chars.Zip(index, (n, w) => n + "=" + w);
foreach (var z in zip) 
{Console.WriteLine(z);
}

运行结果

A=1
B=2
C=3

zip操作生成的序列的长度永远不会长于最短序列。index和letters集合的长度不同,生成的序列将省略index集合中的最后一个元素,因为它没有任何要压缩的内容。

3.4 Select 与 SelectMany

SelectSelectMany的工作都是依据源生成一个或多个结构值。Select为每个源值生成一个结构值。因此,总体结构是一个与源集合具有相同元素数目的集合。 与之相反,SelectMany 生成单个总体结果,其中包含来自每个源值的串联子集合。 作为参数传递到 SelectMany 的转换函数必须为每个源值返回一个可枚举值序列。 然后,SelectMany 串联这些可枚举序列,以创建一个大的序列。

四、Set(设置)运算

LINQ 中的集运算是指根据相同或不同集合(或集)中是否存在等效元素来生成结果集的查询运算。

4.1 Distinct或DistinctBy

删除集合中的重复元素

int[] index = { 1, 2, 3 ,4};
string[] chars = { "A", "B", "C" , "B", "C" ,"D"};
IEnumerable<string> zip = from ch in chars.Distinct() select ch;
foreach (var z in zip) 
{Console.WriteLine(z);
}

运行结果

A
B
C
D

在新.NET Framework中可以使用DistinctBy替代Distinct,DistinctBy采用keySelector。keySelector用作源类型的比较鉴别器。

4.2 Except或ExceptBy

Except返回的序列只包含位于第一个输入序列但不位于第二个输入序列的元素。

string[] listA = { "A", "B", "AC", "BC", "CD" };
string[] chars = { "A", "B", "C" , "B", "C" ,"D"};
IEnumerable<string> listC = from ch in chars.Except(listA) select ch;
foreach (var z in listC) 
{Debug.WriteLine(z);
}

运行结果

C
D

ExceptBy 方法是 Except 的替代方法,它采用可能是异构类型的两个序列和一个 keySelectorkeySelector 与第二个集合的类型相同,用作源类型的比较鉴别器。

4.3 Intersect或IntersectBy

返回序列包含两个输入序列共有的元素。

string[] listA = { "A", "B", "AC", "BC", "CD" };
string[] chars = { "A", "B", "C" , "B", "C" ,"D"};
IEnumerable<string> listC = from ch in chars.Intersect(listA) select ch;
foreach (var z in listC) 
{Debug.WriteLine(z);
}

运行结果

A
B

IntersectBy方法是Intersect的替代方法,它采用可能是异构类型的两个序列和一个keySelectorkeySelector用作第二个集合类型的比较鉴别器。

4.4 Union或UnionBy

两个字符串序列执行的联合操作。返回的序列包含两个输入序列的唯一元素。

string[] listA = { "A", "B", "AC", "BC", "CD" };
string[] chars = { "A", "B", "C" , "B", "C" ,"D"};
IEnumerable<string> listC = from ch in chars.Union(listA) select ch;
foreach (var z in listC) 
{Debug.WriteLine(z);
}

运行结果

A
B
C
D
AC
BC
CD

五、对数据进行排序

排序操作基于一个或多个属性对序列的元素进行排序。 第一个排序条件对元素执行主要排序。 通过指定第二个排序条件,您可以对每个主要排序组内的元素进行排序。

5.1 OrderBy

结果集按升序对值排序。

string[] listA = { "A", "B", "AC", "BC", "CD" };
string[] chars = { "A", "B", "C" , "B", "C" ,"D"};
IEnumerable<string> listC = from ch in chars.Union(listA) orderby ch select ch;
foreach (var z in listC) 
{Debug.WriteLine(z);
}

运行结果

A
AC
B
BC
C
CD
D

5.2 OrderByDescending

按降序对值排序。C#查询表达式语法orderby… descending

string[] listA = { "A", "B", "AC", "BC", "CD" };
string[] chars = { "A", "B", "C" , "B", "C" ,"D"};
IEnumerable<string> listC = from ch in chars.Union(listA) orderby ch descending select ch;
foreach (var z in listC) 
{Debug.WriteLine(z);
}

运行结果

D
CD
C
BC
B
AC
A

5.3 ThenBy

按升序执行次要排序。orderby...,...

string[] listA = { "A", "B", "AC", "BC", "CD" };
string[] chars = { "A", "B", "C" , "B", "C" ,"D"};
IEnumerable<string> listC = from ch in chars.Union(listA) orderby ch,ch.Length select ch;
foreach (var z in listC) 
{Debug.WriteLine(z);
}

运行结果

A
AC
B
BC
C
CD
D

5.4 ThenByDescending

按降序执行次要顺序。C#查询表达式语法orderby…,… descending。

string[] listA = { "AB", "DC", "ED", "FH", "Z" };
IEnumerable<string> listC = from ch in listAorderby ch descending,ch.Length  descendingselect ch;
foreach (var z in listC) 
{Debug.WriteLine(z);
}

运行结果

Z
FH
ED
DC
AB

5.5 Reverse()

反转集合中元素的顺序

string[] listA = { "AB", "DC", "ED", "FH", "Z" };
IEnumerable<string> listC = listA.Reverse();
foreach (var z in listC) 
{Debug.WriteLine(z);
}

运行结果

Z
FH
ED
DC
AB

六、限定符运算

限定符运算返回一个Boolean值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件。

6.1 All

全部确定是否序列中的所有元素都满足条件

class Marketing
{public string Name{get;set;}public string[] Items{get;set;}
}
public static void Main(string[] args)
{List<Marketing> markets={new Market { Name = "Emily's", Items = {"kiwi", "cheery", "banana"} },new Market { Name = "Kim's", Items = {"melon", "mango", "olive"} },new Market { Name = "Adam's", Items = {"kiwi", "apple", "orange"} },} var names = from marker in marketswhere marker.Items.All(item=>item.Length == 5)select Name;foreach(string name in namse){Debug.WriteLine(name);}
}

6.2 Any

使用Any检查所有字符串是否以“o”开头。

class Market
{public string Name{get;set;}public string[] Items{get;set;}
}
public static void Main(string[] args)
{List<Market> markets={new Market { Name = "Emily's", Items = {"kiwi", "cheery", "banana"}},new Market { Name = "Kim's", Items = {"melon", "mango", "olive"} },new Market { Name = "Adam's", Items = {"kiwi", "apple", "orange"} },  }IEnumerable<string> names = from market in marketswhere market.Items.Any(item=>item.StartsWith("o"))select market.Name;foreach(string name in names){Debug.WriteLine(name);}
}

6.2 Contains

Contains检查所有数组是否具有特定元素。

class Market
{public string Name{get;set;}public string[] Items{get;set;}
}
public static void Main(string[] args)
{List<Market> markets={new Market { Name = "Emily's", Items = {"kiwi", "cheery", "banana"}},new Market { Name = "Kim's", Items = {"melon", "mango", "olive"} },new Market { Name = "Adam's", Items = {"kiwi", "apple", "orange"} },  }IEnumerable<string> names = from market in marketswhere market.Items.Contains("kiwi")select market.Name;foreach(string name in names){Debug.WriteLine(name);}
}

七、数据分区

Linq中的数据分区是指将输入序列划分为两个部分的操作,无需重新排列元素,然后返回其中一个部分。

7.1 Skip

Skip跳过序列中指定位置之前的元素。

string[] items ={"A", "B","C","D","E","F","G","H","I"};
var item= items.Skip(5);
foreach (var it in item) 
{Console.WriteLine(it);
}

运行结果

F
G
H
I

7.2 SkipWhile

Skip指定跳过的数目,SkipWhile指定的跳过条件,而不是元素数。

string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
IEnumerable<string> skippedTexts = texts.SkipWhile(value => value.EndsWith("n"));
foreach (var it in skippedTexts) 
{Console.WriteLine(it);
}

运行结果

Tue
Wed
Thu
Fri
Sat

7.3 Take

获取序列中指定位置之前的元素

string[] texts = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
// 删除尾字母为n的
IEnumerable<string> skippedTexts = texts.Take(3);
foreach (var it in skippedTexts) 
{Console.WriteLine(it);
}

运行结果

Sun
Mon
Tue

7.4 TakeWhile

TakeWhile操作符用于从输入序列中返回指定数量且满足一定条件的元素。

TakeWhile操作符被调用时,会将source序列中的每一个元素顺序传递给委托predicate,只有哪些使用得predicate返回值为true的元素才会被添加到结果序列中,要特别注意是,当TakeWhile操作符在查找过程中,遇到第一个返回false的元素就会立即停止执行,跳出,无论后面还有没有符合条件的元素,即使后面有符合条件的元素也不会获取。对于第二个扩展方法,委托里面含有一个int类型的参数。

string[] lists = ["a", "e", "i", "o", "u"];
var takeList = lists.TakeWhile(x => x != "i");
foreach (var al in takeList) 
{Console.WriteLine(al);
}

运行结果

a
e

7.5 Chunk

chunk 该方法将序列的元素拆分为指定大小的区块

string[] lists = {"公孙胜","鲁智深","林冲","吴用","李逵","宋江","武松" };
var nameList = lists.Chunk(3);
foreach (var names in nameList) 
{foreach (var name in names) {Trace.WriteLine(name);}Trace.WriteLine("****************");
}

运行结果

公孙胜
鲁智深
林冲
****************
吴用
李逵
宋江
****************
武松
****************

相关文章:

【.NET Core】Linq查询运算符(一)

【.NET Core】Linq查询运算符&#xff08;一&#xff09; 文章目录 【.NET Core】Linq查询运算符&#xff08;一&#xff09;一、概述二、筛选数据三、投影运算3.1 Select 3.2 SelectMany3.3 Zip3.4 Select 与 SelectMany 四、Set&#xff08;设置&#xff09;运算4.1 Distinct…...

Python sorted函数及用法以及如何用json模块存储数据

Python sorted函数及用法 sorted() 函数与 reversed() 函数类似&#xff0c;该函数接收一个可迭代对象作为参数&#xff0c;返回一个对元素排序的列表。 在交互式解释器中测试该函数&#xff0c;可以看到如下运行过程&#xff1a; >>> a [20, 30, -1.2, 3.5, 90, 3.…...

使用opencv将sRGB格式的图片转换为BT.2020格式【sRGB】【BT.2020】

将sRGB格式的图片转换为BT.2020格式涉及到两个步骤&#xff1a;首先将sRGB转换到线性RGB&#xff0c;然后将线性RGB转换到BT.2020。这是因为sRGB图像通常使用伽马校正&#xff0c;而BT.2020工作在线性色彩空间中。 从sRGB到线性RGB&#xff1a;sRGB图像首先需要进行伽马校正解码…...

聊天注意事项

聊天成功的核心就是双方都能舒服 有些人不会聊天是缺乏引导性 聊天聊两句话就没了 聊天要把话题引导向对方 从倾诉者变为倾听者 才能不断交流 沟通不是一个人的独角戏 每个人都渴望被理解 要注意倾听别人说的话 不要只顾自己说一大堆&#xff0c;别人都瞌睡了 不要查户口式问…...

12.5 作业

1&#xff0c; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有…...

深入理解指针3

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起继续深入学习指针&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#xff01;&#xff01; 话不多说&am…...

大数据环境下在线考试系统安全策略研究

摘 要 随着云计算、物联网、电子商务、企业信息化等的飞速发展&#xff0c;以及智能终端和各种检测、感应设备的普及和建设&#xff0c;全球逐渐进入信息化、网络化&#xff0c;由此产生了指数爆炸般的数据增长&#xff0c;一个大规模生产、分享和应用的数据的时代正在开启&am…...

Python中程序的异常处理

Python程序一般对输入有一定要求&#xff0c;担当实际输入不满足程序要求时&#xff0c;可能会产生程序的运行错误。Python语言使用的保留太容易try和except进行异常处理&#xff01; try: 语句块1 except: 语句块2 语句块1是正常执行的程序内容&#xff0c;当这个语句块发生异…...

有趣的代码——有故事背景的程序设计3

这篇文章再和大家分享一些有“背景”的程序设计&#xff0c;希望能够让大家学到知识的同时&#xff0c;对编程学习更感兴趣&#xff0c;更能在这条路上坚定地走下去。 目录 1.幻方问题 2.用函数打印九九乘法表 3.鸡兔同笼问题 4.字数统计 5.简单选择排序 1.幻方问题 幻方又…...

聚观早报 |国行PS5轻薄版开售;岚图汽车11月交付7006辆

【聚观365】12月2日消息 国行PS5轻薄版开售 岚图汽车11月交付7006辆 比亚迪推出12月限时优惠 特斯拉正式交付首批Cybertruck 昆仑万维发布「天工 SkyAgents」平台 国行PS5轻薄版开售 索尼最新的PlayStation5主机&#xff08;CFI-2000型号组-轻薄版&#xff09;国行版本正…...

Kafka 保证消息消费全局顺序性

当有消息被生产出来的时候&#xff0c;如果没有指定分区或者指定 key &#xff0c;那么消费会按照【轮询】的方式均匀地分配到所有可用分区中&#xff0c;但不一定按照分区顺序来分配 我们知道&#xff0c;在 Kafka 中消费者可以订阅一个或多个主题&#xff0c;并被分配一个或多…...

3分钟在CentOS 7上离线安装Docker

在CentOS 7上离线安装Docker的详细步骤如下&#xff1a; 环境检查和准备 检查内核版本&#xff1a;Docker要求系统为64位且内核版本至少为3.10。使用命令uname -r查看内核版本。 检查CentOS版本&#xff1a;通过命令cat /etc/redhat-release查看版本信息。 更新yum包&#xff0…...

GaussDB数据库SQL系列-触发器

目录 一、前言 二、触发器概念 三、GaussDB数据库中的触发器 1、语法格式 2、创建步骤 3、注意事项 4、附&#xff1a;表和视图上支持的触发器种类 四、GaussDB数据库中的示例 示例一、在GaussDB数据库中创建一个触发器&#xff0c;以便在插入新记录时自动将记录的创建…...

网工学习10-IP地址

一、IP地址概念 IP地址是一个32位的二进制数&#xff0c;它由网络ID和主机ID两部份组成&#xff0c;用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段&#xff1b;主机ID用来标识计算机在网段中的位置。IP地址通常用4组3位十进制数表示&#xff0c;中间用…...

二百零八、Hive——HiveSQL异常:Select查询数据正常,但SQL语句加上group by查询数据为空

一、目的 在HiveSQL的DWD层中&#xff0c;需要对原始数据进行去重在内的清洗&#xff0c;结果一开始其他数据类型的清洗工作都正常&#xff0c;直到碰到转向比数据。 一般的SQL查询有数据&#xff0c;但是加上group by以后就没数据&#xff1b; 一般的SQL查询有数据&#xf…...

Docker—共享应用程序

现在您已经构建了一个映像&#xff0c;可以共享它。要共享Docker映像&#xff0c;您必须使用Docker注册表。默认注册表是Docker Hub&#xff0c;是您使用的所有图像的来源。 Docker ID&#xff08;Docker标识&#xff09; Docker ID允许您访问Docker Hub&#xff0c;这是世界上…...

Linux横向移动

Linux横向移动 主机存活探测 shell for i in 192.168.111.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i is alived; fi; done 或者 for k in $( seq 1 255);do ping -c 1 192.168.1.$k|grep "ttl"|awk -F "[ :]" {print $4}; d…...

Ubuntu 20.0 + mysql 8.0 用户和密码修改

第一步 下载&#xff08;简单,注意联网&#xff09;Ubuntu 终端输入以下两行命令 (1) 数据库的服务端及客户端数据库的开发软件包 sudo apt-get install mysql-server mysql-client (2) 数据库的开发软件包 sudo apt-get install libmysqlclient-dev 第二步 查看是否安装成功 …...

看懂lscpu的输出

文章目录 1. lscpu1.1 Architecture1.2 逻辑核心数1.3 缓存1.4 CPU型号1.5 NUMA架构1.5.1 CPU多核架构1.5.2 多CPU Socket架构 2. cat /proc/cpuinfo2.1 关键字段 1. lscpu 通过lscpu查看当前系统的CPU信息。 [hadoopserver3 ~]$ lscpuArchitecture: x86_64 …...

RoPE旋转位置编码浅析

RoPE旋转位置编码浅析 本文介绍了旋转位置编码RoPE在大模型中的广泛应用,包括Llama、Mistral 7B、Baichuan、ChatGLM、Qwen、…等。由于计算资源限制,大模型通常在较小的上下文长度中进行训练,导致在推理超出预训练长度时性能显著下降。为了解决这个问题,涌现了许多基于Ro…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...