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

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

文章目录

    • 【.NET Core】Linq查询运算符(二)
    • 一、概述
    • 二、生成运算
      • 2.1 DefaultIfEmpty
      • 2.2 Empty
      • 2.3 Range
      • 2.4 Repeat
    • 三、相等运算
      • 3.1 SequenceEqual
    • 四、元素运算
      • 4.1 ElementAt
      • 4.2 ElementAtOrDefault
      • 4.1 First
      • 4.2 FirstOrDefault
      • 4.3 Last
      • 4.4 LastOrDefault
      • 4.5 Single
      • 4.6 SingleOrDefault
    • 五、转换数据类型
      • 5.1 AsEnumerable
      • 5.2 AsQueryable
      • 5.3 AsEnumerable和AsQueryable
      • 5.4 Cast
      • 5.5 OfType
      • 5.6 ToArray
      • 5.7 ToDictionary
      • 5.8 ToList
      • 5.9 ToLookup

一、概述

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

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

《Linq查询运算符(一)》详细介绍了筛选数据投影运算设置运算数据排序限定符运算数据分区本章将继续介绍。

二、生成运算

2.1 DefaultIfEmpty

返回指定序列的元素;如果序列为空,则返回单一实例集合中的类型参数的默认值。

IList<int> list = new List<int>();
var lst= list.DefaultIfEmpty();
foreach (var item in lst) 
{Console.WriteLine(item);
}

输出结果

0

2.2 Empty

初始化一个Empty空集合

var list=new List() 等于 var list = Enumerable.Empty();

var lst= Enumerable.Empty<int>();
foreach (var item in lst) 
{Console.WriteLine(item);
}

2.3 Range

Range()方法返回IEnumerable类型的集合,该集合具有指定数量的元素和从第一个元素开始的顺序值。

var lst = Enumerable.Range(5, 2);
foreach (var item in lst)
{Console.WriteLine(item);
}

执行结果

5
6

2.4 Repeat

Repeat()方法使用指定数量的元素生成IEnumerable类型的集合,每个元素包含相同的指定值。

var lst = Enumerable.Repeat<double>(5, 2)
foreach (var item in lst)
{Console.WriteLine(item);
}

执行结果

5
5

三、相等运算

3.1 SequenceEqual

两个序列,其相应元素相等且具有被视为相等的相同数量的元素

public class Person
{public int Id { get; set; }public string Code { get; set; }public string Name { get; set; }
}
IList<int> listA = new List<int>() { 1, 2, 3, 4 };
IList<int> listB = new List<int>() { 1, 2, 3, 4 };
IList<int> listC = new List<int>() { 2, 1, 3, 4 };
bool falg= Enumerable.SequenceEqual(listA, listB);
Console.WriteLine(falg);
bool falgC = Enumerable.SequenceEqual(listA, listC);
Console.WriteLine(falgC);IList<Person> peopleA = new List<Person>() {new Person { Id = 2, Code = "002", Name = "CAZ" },new Person { Id = 2, Code = "002", Name = "CAZ" },
};IList<Person> peopleB = new List<Person>() {new Person { Id = 2, Code = "002", Name = "CAZ" },new Person { Id = 2, Code = "002", Name = "CAZ" },
};
bool flagPersonA = Enumerable.SequenceEqual<Person>(peopleA, peopleB);
Console.WriteLine(flagPersonA);
bool flagPersonB = Enumerable.SequenceEqual<Person>(peopleA, peopleB, new StudentComparer());
Console.WriteLine(flagPersonB);/// <summary>
/// 重写比较接口
/// </summary>
public class StudentComparer : IEqualityComparer<Person>
{public bool Equals(Person? x, Person? y){if (x.Id == y.Id && x.Code.ToLower() == y.Code.ToLower())return true;return false;}public int GetHashCode([DisallowNull] Person obj){return obj.GetHashCode();}
}

四、元素运算

元素运算从序列中返回唯一,特定的元素。

4.1 ElementAt

返回集合中指定索引处的元素。

IList<Person> peopleA = new List<Person>() {new Person { Id = 1, Code = "001", Name = "任峻" },new Person { Id = 2, Code = "002", Name = "陈矫" },new Person { Id = 3, Code = "003", Name = "丁仪" },new Person { Id = 4, Code = "004", Name = "司马朗" },new Person { Id = 5, Code = "005", Name = "夏侯渊" },
};
Person person= peopleA.ElementAt(4);
Console.WriteLine($"Id={person.Id},Code={person.Code},Name={person.Name}");

执行结果

Id=5,Code=005,Name=夏侯渊

4.2 ElementAtOrDefault

返回集合中指定索引处的元素;如果索引超出范围,则返回默认值。

IList<Person> peopleA = new List<Person>() {new Person { Id = 1, Code = "001", Name = "任峻" },new Person { Id = 2, Code = "002", Name = "陈矫" },new Person { Id = 3, Code = "003", Name = "丁仪" },new Person { Id = 4, Code = "004", Name = "司马朗" },new Person { Id = 5, Code = "005", Name = "夏侯渊" },
};
Person person= peopleA.ElementAtOrDefault<Person>(5);
Console.WriteLine($"Id={person?.Id},Code={person?.Code},Name={person?.Name}");

执行结果

Id=,Code=,Name=

4.1 First

返回集合的第一个元素或满足条件的第一个元素。

IList<Person> peopleA = new List<Person>() {new Person { Id = 1, Code = "001", Name = "任峻" },new Person { Id = 2, Code = "002", Name = "陈矫" },new Person { Id = 3, Code = "003", Name = "丁仪" },new Person { Id = 4, Code = "004", Name = "司马朗" },new Person { Id = 5, Code = "005", Name = "夏侯渊" },
};
Person person= peopleA.First();
Console.WriteLine($"Id={person?.Id},Code={person?.Code},Name={person?.Name}");

执行结果

Id=1,Code=001,Name=任峻

4.2 FirstOrDefault

int[] numbers = new int[] { 1, 2, 3, 5, 7, 11 };
var nums = numbers.FirstOrDefault<int>(e=>e<1);
Console.WriteLine($"{ nums}");

执行结果

0

4.3 Last

返回集合的最后一个元素或满足条件的最后一个元素。

int[] numbers = new int[] { 1, 2, 3, 5, 7, 11 };
var nums = numbers.Last(e=>e<5);
Console.WriteLine($"{ nums}");

执行结果

3

4.4 LastOrDefault

返回集合的最后一个元素或满足条件的最后一个元素。 如果此类元素不存在,则返回默认值。

int[] numbers = new int[] { 1, 2, 3, 5, 7, 11 };
var nums = numbers.LastOrDefault(e=>e>11);
Console.WriteLine($"{ nums}");

执行结果

0

4.5 Single

返回集合的唯一一个元素或满足条件的唯一一个元素。如果没有要返回的元素或要返回多个元素,则引发InvalidOperationException。

int[] numbers = new int[] { 100};
int result = numbers.Single();
Console.WriteLine(result);

执行结果

100

4.6 SingleOrDefault

返回集合的唯一一个元素或满足条件的唯一一个元素。如果没有要返回的元素或要返回多个元素,则引发InvalidOperationException。

int[] numbers = new int[] { 100};
int result = numbers.SingleOrDefault();
Console.WriteLine(result);

执行结果

100

五、转换数据类型

转换数据类型可以通过转换方法更改输入对象的类型。名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合。名称以“To”开头的方法可枚举(即时加载)源集合并将项放入相应的集合类型。

5.1 AsEnumerable

所有实现了IEnumerable接口的类型都可以调用此方法来获取一个IEnumerable集合。此方法一般仅用于实现类中的方法与IEnumerable接口方法重名时。

var products = db.Product.AsEnumerable().Select(p => new {p.Id, p.Name, p.CreateTime.Date});

在迭代时遇见AsEnumerable()会先进行Sql查询,对已查出来的结果当然能进行Linq to object操作。

5.2 AsQueryable

AsQueryable将一个序列向下转换 一个IQueryable,它生成了一个本地查询的IQueryable包装。IQueryable实现了IEnumerable接口。但IEnumerable换成IQueryable后速度提高很多。

var query = (from item in context.Users.AsQueryable() where item.id > 10select item.id).ToList();

5.3 AsEnumerable和AsQueryable

  1. AsEnumerable()是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList…的时候)才执行。
  2. AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。
  3. AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
  4. AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。
  5. ToList()立即执行。
  6. 当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable /IQueryable。
  7. AsEnumerable()虽然延迟执行,但还是访问数据库,而.ToList()直接取得结果放在内存中。比如我们需要显示两个部门的员工时,部门可以先取出放置在List中,然后再依次取出各个部门的员工,这时访问的效率要高一些,因为不需要每次都访问数据库去取出部门。
  8. IQueryable实现了IEnumberable接口。但IEnumerable 换成IQueryable后速度提高很多。
  9. IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先。

5.4 Cast

将集合中的元素转换为指定类型。

DataRow row=dt.Rows.Cast<DataRow>().Single();

5.5 OfType

根据其转换为指定类型的能力筛选值。

List<object> objList = new List<object> {new { ID = 1, Name = "阿里" },new { ID = 2, Name = "百度" },new Person() { Id=1, Name = "马云", Code="001" }
};
var p = objList.OfType<Person>().ToList();
foreach (var item in p)
{Console.WriteLine(item.Name);
}

5.6 ToArray

将结合转换为数组。此方法强制执行查询。

IList<string> list = new List<string>() { "A", "B", "C" };
string[] arr= list.ToArray();

5.7 ToDictionary

根据键选择器函数将元素放入Dictionary<TKey,TValue>。此方法强制执行查询。

Person[] parameters = new Person[]
{new Person() { Id = 1, Code = "052", Name = "正一郎" },new Person() { Id = 2, Code = "028", Name = "清次郎" },new Person() { Id = 3, Code = "020", Name = "誠三郎" },new Person() { Id = 4, Code = "018", Name = "征史郎" },
};
Dictionary<int, Person> dictionary = parameters.ToDictionary(value => value.Id);

5.8 ToList

将集合转换为List<T>。此方法强制执行查询。

string[] strArr =  { "1","2", "3" };
IList<string> strList = strArr.ToList();

5.9 ToLookup

根据键选择器函数将元素放入Lookup<TKey,TElement>(一对多字典)。此方法强制执行查询。该ToLookup()是不可改变,一旦创建一个Lookup,不能添加或删除元素。

IList<Person> values = new List<Person>()
{new Person { Id=1,Name="0001"},new Person { Id=2,Name="0002"},new Person{ Id=3,Name="0003"},new Person{ Id=4,Name="0004"},
};
var list = values.ToLookup(e => e.Id);
foreach (var item in list) 
{Console.WriteLine(item.Key);
}

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

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

相关文章

【开源】基于Vue.js的假日旅社管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 078 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S078。} 文末获取源码&#xff0c;项目编号&#xff1a;S078。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四…

【实用经验】如何根据CVE编号找到安全补丁

找到对应补丁页面 例如查找编号为 CVE-2019-0708 的漏洞&#xff0c;访问下面链接即可&#xff0c;替换末尾编号可获取其他漏洞更新补丁。 https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-0708根据实际情况点击右侧补丁链接即可跳转下载 最后根据实际情况下…

提高Google play马甲包应用上架成功率及延长应用在线时长相关措施探讨

众所周知&#xff0c;Google play不允许开发者们发布马甲包应用&#xff0c;开发者们需要采取一些措施来规避谷歌系统的审核&#xff0c;以便能成功上架马甲包应用和延长应用的在线时长&#xff0c;从而获得更多的曝光和下载量。 首先&#xff0c;需要对应用包进行包装&#xf…

水平自动扩容和缩容HPA;API资源对象NetworkPolicy;Kubernetes用户安全控制;Kubernetes创建普通用户示例

水平自动扩容和缩容HPA&#xff1b;API资源对象NetworkPolicy&#xff1b;Kubernetes用户安全控制&#xff1b;Kubernetes创建普通用户示例 水平自动扩容和缩容HPA&#xff08;本部分操作适合K8s版本>1.23.x) HPA全称是Horizontal Pod Autoscaler&#xff0c;翻译成中文是…

揭秘C语言结构体:通往内存对齐的视觉之旅

揭秘C语言结构体&#xff1a;通往内存对齐的视觉之旅 引言 在C语言的编程旅程中&#xff0c;结构体&#xff08;structs&#xff09;是一个关键而强大的概念。结构体不仅允许我们组织和存储不同类型的数据&#xff0c;而且通过深入了解内存对齐&#xff0c;我们可以更好地优化…

Python+requests+unittest+excel实现接口自动化测试框架

在刚刚进入测试行业的时候&#xff0c;最开始也是做功能测试&#xff0c;我想很多伙伴和我一样&#xff0c;觉得自动化测试都很高端&#xff0c;很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化&#xff0c;后面发现excel个人觉得更加适合&#x…

初始类与对象

初始类与对象 实验介绍 本课程是进一步对类与对象的深入认识&#xff0c;如何定义并实例化一个类&#xff0c;介绍如何使用 C 标准库 string 类等。 知识点 认识类与对象内联函数string 类类的定义与实例化 认识类与对象 官方定义 类&#xff1a;在面向对象编程中是一种…

总结1077

这两天复习强度大&#xff0c;复习到头疼了。昨天复习了6h的数学&#xff0c;晚上头疼的睡不着觉。今日情况也好不到哪去。 数学这门&#xff0c;完全被整慌了。从做模拟卷的情况看&#xff0c;效果比做真题差许多。怕被打击到&#xff0c;也没算分。就这一门没复习好&#xf…

自定义starter案例——统计独立IP访问次数

自定义starter案例——统计独立IP访问次数 文章目录 自定义starter案例——统计独立IP访问次数ip计数业务功能开发定时任务报表开发使用属性配置功能设置功能参数配置调整 自定义拦截器开启yml提示功能 ip计数业务功能开发 public class IpCountService {private Map<String…

matplot函数调整子图大小测试

调整subplot()函数的子图间距 import numpy as np import matplotlib.pyplot as plt for i in range(1,7):figsize 10,6plt.subplot(2,3,i)plt.text(0.5,0.5,str((2,3,i)),fontsize18,hacenter) **plt.subplots_adjust(hspace3.3, wspace0.3)** plt.show()import numpy as np…

水果党flstudio用什么midi键盘?哪个版本的FL Studio更适合我

好消息&#xff01;好消息&#xff01;特大好消息&#xff01; 水果党们&#xff01;终于有属于自己的专用MIDI键盘啦&#xff01; 万众期待的Novation FLKEY系列 正式出炉&#xff01; 话有点多话&#xff0c;先分享一份干货&#xff0c;尽快下载 FL Studio 21 Win-安装包&…

2023人工智能和市场营销的融合报告:创造性合作的新时代需要新的原则

今天分享的人工智能系列深度研究报告&#xff1a;《2023人工智能和市场营销的融合报告&#xff1a;创造性合作的新时代需要新的原则》。 &#xff08;报告出品方&#xff1a;M&CSAATCHITHINKS&#xff09; 报告共计&#xff1a;11页 生成型人工智能的兴起和重要性 生成式…

美易投资:股价低于1美元的美股数量激增,低价股会下跌成趋势?

随着疫情的蔓延和股市的波动&#xff0c;越来越多的美股股价低于1美元&#xff0c;这一现象引起了市场的广泛关注。低价股数量的激增是否会逆势下跌成为市场趋势&#xff0c;这是投资者们需要思考的问题。 首先&#xff0c;我们需要了解股价低于1美元的背后原因。一方面&#x…

深入探讨Redis高可用性解决方案:Sentinel与Cluster对比

目录 引言 Redis Sentinel&#xff1a;监控与故障切换 工作原理 关键特点 Redis Cluster&#xff1a;分布式与自动化 工作原理 关键特点 对比与选择 架构差异 配置差异 自动化程度 适用场景 结语 引言 在构建可靠的分布式系统中&#xff0c;Redis作为一种高性能的…

P8 Linux 目录操作

目录 前言 01 mkdir 系统调用 mkdir的代码示例 02 rmdir删除目录 03 打开、读取以及关闭目录 3.1 opendir()函数原型&#xff1a; 04 读取目录 readdir() 05 struct dirent 结构体&#xff1a; 06 rewinddir ()函数重置目录流 07 关闭目录 closedir ()函数 测试:打印…

IT基础监控方案:5台服务器和20台网络设备监控

一、项目背景与目标 随着中小企业业务的快速发展&#xff0c;网络设备数量不断增加&#xff0c;运维工作面临巨大挑战。为了提高网络设备运行稳定性、降低故障风险并实现高效管理&#xff0c;本方案旨在建立一个基础监控与管理的平台&#xff0c;实现对5个服务器和20多个网络设…

基于深度学习的遥感图像变化差异可视化系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 遥感图像变化差异可视化是遥感图像处理和分析的重要研究领域之一。随着遥感技术的快速发展和遥感数据的广泛应用&#xff0c;遥感图像的获取和处理变得越来越容易…

英伟达显卡系列与架构、代表产品

主要系列 1、GeForce系列&#xff1a; GeForce系列是NVIDIA最主要的消费者显卡系列&#xff0c;用于游戏和娱乐。包括不同性能水平的产品&#xff0c;从入门级到高端。 2、Quadro系列&#xff1a; Quadro系列是专业级别的显卡&#xff0c;主要用于专业图形工作站&#xff0c;…

【LeeCode】1.两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…