LINQ 和 LINQ扩展方法 (1)

news2024/11/16 18:06:14

LINQ函数概念:

LINQ(Language Integrated Query)是一种C#语言中的查询技术,它允许我们在代码中使用类似SQL的查询语句来操作各种数据源。这些数据源可以是集合、数组、数据库、XML文档等等。LINQ提供了一种统一的编程模型,使我们能够使用相同的方式来查询和操作不同类型的数据。

在C#中,LINQ主要由以下几个组成部分:

数据源(Data source):可以是集合、数组、数据库、XML文档等等。
查询变量(Query variable):用于存储查询结果的变量。
查询表达式(Query expression):类似于SQL语句的查询表达式,用于描述查询的逻辑和条件。
查询操作符(Query operator):用于执行各种查询操作,如筛选、排序、分组、投影等等。
查询结果(Query result):查询操作的返回结果。

其中数据源,查询变量,查询结果是必选项,查询表达式,查询操作符是可选项。

LINQ 查询关键字

1.where 条件,查询的逻辑和条件,扩展where()

// 1.where 条件,查询的逻辑和条件,扩展where()
List<int> list1 = new List<int>() { 6, 4, 2, 7, 9, 0 };
IEnumerable<int> query = list1.Where(c => c >= 1 && c <= 5);
for (int i = 0; i <= query.Count() - 1; i++)
{
    Console.WriteLine(query.ToArray()[i]);  // 4,2 
}
// LINQ是强类型,会根据数据源的类型推断出来查询结果的类型。
IEnumerable<int> query2 = from item in list1
                              //where item >=1 && item <= 5 // 4,2   // 并列 && ,或者|| 等于== 不等于!=, >,<,>=,<=,!
                              //where !(item % 2 == 0)   
                              //where !GetEven(item)  // 7,9
                          select item;
for (int i = 0; i <= query2.Count() - 1; i++)
{
    Console.WriteLine(query2.ToArray()[i]);
}

List<string> list2 = new List<string>() { "abc", "adf", "ef", "bga", "cdf" };
IEnumerable<string> query3 = from item in list2
                             where item.Contains("a") || item.Contains("e")   //item.Contains 查询指定字符是否出现在字符串中
                             select item;
for(int i = 0; i <= query3.Count() - 1; i++)
{
    Console.WriteLine(query3.ToArray()[i]);
}


// 1.where条件中封装的一个方法
private bool GetEven(int num)
{
    return num % 2 == 0;
}
字符串返回结果:

2.对查询结果做筛选(显示和隐藏列)

// 2.对查询结果做筛选(显示和隐藏列) Select()扩展方法和select子名类似, SelectMany()类似于两个from
/**/
//创建两个整数列表:
List<int> list1 = new List<int>() { 1, 2, 3 };
List<int> list2 = new List<int>() { 4, 5, 6 };
//使用Select方法对list1中的每个元素进行查询,
var result1 = list1.Select(item => item);
//使用查询语法对list1中的每个元素进行查询
var result2 = from item in list1
              select item;

// 使用SelectMany方法查询多个数据源,item指的是list1中的每一项
var result3 = list1.SelectMany(item => list2);
// Data To Object==DTO把查询出来的数据转换成对象,目的:访问时方便,打点调用
var result4 = from item in list1
              from value in list2
              //select new { item,value};
              select new IntObject() { Key = item , Value = value };
// 将result4的结果转换为List<IntObject>类型的列表,并存储在result5中
List<IntObject> result5 = result4.ToList();
// 循环遍历result5列表,并打印结果
for ( int i = 0;i < result5.Count;i++)
{
    var obj = result5[i];
    Console.WriteLine($"Key:{obj.Key},Value:{obj.Value}");
}
输出结果:

3. 分组  GroupBy(), group子名,into子句

1.GroupBy()本身具有延迟执行的特性,而ToLookup()没有。
List<string> sequence = new List<string>() { "a", "b", "b", "c", "c" };
// GroupBy(o => o)是一个 lambda 表达式,用于指定 GroupBy 方法分组的依据
var group = sequence.GroupBy(o => o);  // 默认GroupBy统计的是Count
foreach (var g in group)
{
    Console.WriteLine("Key:{0}, Count:{1}", g.Key, g.Count());
}

输出结果:

这表明"a" 出现了 1 次,"b" 出现了 2 次,"c" 出现了 2 次。

PS: GroupBy(o => o) 作为 GroupBy 方法的键选择器,是一种简洁且直观的方式来按元素的值进行分组。这种写法不仅代码简洁,而且易于理解和维护。

2.group子名,into子句

group ... by ... into ...这是一个查询表达式,用于将数据源中的元素按照指定的键选择器进行分组。这种查询表达式是LINQ(Language Integrated Query)的一部分,它允许你以声明式的方式对集合进行查询和操作。

// 使用LINQ 进行数据分组和查询
// 1.使用了LINQ的查询语法,对一个名为sequence的序列进行操作。
// 2.通过group item by item语句,将序列中的元素按照它们的值进行分组。每个元素的值作为分组的键。
// 3.通过into groupResult子句,将分组的结果存储在一个名为groupResult的变量中。
// 4.使用foreach循环遍历查询结果,即遍历每个分组。
// 5.在foreach循环中,使用Console.WriteLine方法打印每个分组的键(即分组的值)和分组中元素的数量。
List<string> sequence = new List<string>() { "a", "b", "b", "c", "c" };

// 第一段代码:
var result = from item in sequence
             group item by item into groupResult  // into子句:把分组的结果保存到一个变量中,方便取分组的结果
             select groupResult;

foreach (var item in result)
{
    Console.WriteLine($"Key:{item.Key}, Count:{item.Count()}");
}

// 第二段代码(省略了into子句,)
var resulta = from item in sequence
              group item by item;

foreach (var item in resulta)
{
    Console.WriteLine($"Key:{item.Key}, Count:{item.Count()}");
}

 4. ToLookup()  扩展方法来将数据集合分组

 ToLookup() 相当于group by into    GroupBy()相当于group by 

  • 数据分组ToLookup提供了一种方便的方式来根据某个属性对集合中的元素进行分组,这在处理需要按类别或属性分组的数据时非常有用。当你需要根据某个属性或条件将数据集合分成多个小组时,可以使用ToLookup
  • 数据展示:在分组后,可以遍历这些分组,对每个分组进行特定的操作,如计算、展示等。
// 方式一: 使用ToLookup()
// 创建了一个Person对象的列表,每个Person对象包含姓名(Name)、分数(Score)和组别(Group)。
var nameValueScore = new Person[]
{
    new Person(){Name = "张三",Score = 80,Group = "A"},
    new Person(){Name = "李四",Score = 76,Group = "B"},
    new Person(){Name = "王五",Score = 94,Group = "A"}
};

// 使用ToLookup进行分组
var lookupValues = nameValueScore.ToLookup(p => p.Group);
// 遍历分组结果
foreach (var g in lookupValues)   // 循环每一组
{
    Console.WriteLine($"组名:{g.Key}");
    foreach (var item in g)   // 循环一组中的多个人
    {
        Console.WriteLine($"姓名:{item.Name},分数:{item.Score},分组:{item.Group}");
    }
}
 //外层的foreach循环遍历lookupValues中的每个分组(即每个组别)。
//内层的foreach循环遍历每个分组中的所有Person对象,并打印出每个人的姓名、分数和组别。

// 方式二: 使用group...by...into...
 var result = from p in nameValueScore
              group p by p.Group into g
              select g;
 foreach (var g in lookupValues)   // 循环每一组
 {
     Console.WriteLine($"组名:{g.Key}");
     foreach (var item in g)   // 循环一组中的多个人
     {
         Console.WriteLine($"姓名:{item.Name},分数:{item.Score},分组:{item.Group}");
     }
 }

输出结果:

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

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

相关文章

2024/9/11 数学20题(拐点、定积分比大小、二重积分比大小)

拐点&#xff1a; 1000题基础篇&#xff1a; 1000题强化篇&#xff1a; 选b 、 定积分比大小&#xff1a; 二重积分比大小&#xff1a;

【读书笔记-《30天自制操作系统》-19】Day20

本篇的内容围绕系统调用展开。为了让应用程序能够调用操作系统功能&#xff0c;引入了系统调用以及API的概念。首先实现了显示单个字符的API&#xff0c;让应用程序通过传递地址的方式进行调用&#xff1b;接下来又改进为通过中断的方式进行调用。在此基础上继续实现了显示字符…

【CanMV K230 AI视觉】人脸姿态(脸部朝向)

【CanMV K230 AI视觉】人脸姿态&#xff08;脸部朝向&#xff09; 人脸姿态&#xff08;脸部朝向&#xff09; &#xff08;动态测试效果可以去下面网站自己看。&#xff09; B站视频链接&#xff1a;已做成合集 抖音链接&#xff1a;已做成合集 人脸姿态&#xff08;脸部朝向…

基于yolov8的工程车辆挖掘机叉车卡车检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的工程车辆&#xff08;如挖掘机、叉车、卡车&#xff09;检测系统是一种利用先进深度学习技术的智能监控系统。该系统集成了YOLOv8算法&#xff0c;该算法以其高效的检测速度和准确的识别能力著称&#xff0c;特别适用于实时视频分析场景。 该系统通…

C2 Magic 附工具下载,供学习使用

最近&#xff0c;我们进行了一次安全演练&#xff0c;想要模拟一些复杂的攻击场景并测试我们的防御能力。这时&#xff0c;我想到了一款开源工具&#xff0c;它在处理抗沙箱后门启动和隐蔽ShellCode调用方面表现得非常出色。这款工具的设计理念是为了帮助安全团队更好地应对高级…

使用QT界面运行roslaunch,roslaunch,roscore等

QT通过界面运行rosrun,roslaunch,roscore等 QT 运行roslaunch加入ui界面修改cmakelist运行 使用qt界面运行rosrun&#xff0c;roscore,roslaunch等方法一方法二方法三 QT 运行roslaunch 首先需要使用QT安装好ROS插件&#xff0c;并且配置好环境&#xff0c;这个在之前的文章已…

nvm ls-remote: N/A

背景&#xff1a; 项目因为node版本问题运行失败&#xff0c;在彻底删除node后再重新安装 问题描述&#xff1a; 原因分析&#xff1a; 可能是因为终端不能获取镜像包 解决办法&#xff1a; 【方法一】 输入&#xff1a; step1. export NVM_NODEJS_ORG_MIRRORIndex of …

数据处理与统计分析篇-day01-Linux基础与环境搭建

day01-Linux基础 计算机简介 概述 电子计算机, 电脑, PC, Computer, 就是由 软件 硬件组成的 电子设备. 组成 计算机硬件 CPU(运算器, 控制器) 存储器(内存, 外存) 输入设备 输出设备 计算机软件 系统软件: 充当 用户 和 计算机硬件之间的 桥梁的. PC端: windows, Linu…

Elasticsearch 使用误区之五——单次请求获取大量数据

在使用 Elasticsearch 进行数据查询时&#xff0c;很多开发者、读者会遇到这样的问题&#xff1a;一次性检索大量数据&#xff0c;导致查询速度缓慢、网络延迟增加&#xff0c;甚至影响系统的整体性能。 单次获取过多数据不仅增加了网络传输的负担&#xff0c;还会使查询过程复…

Vue 中的 Web Workers:提升性能与流畅度

大家可能都听到过 Web Workers&#xff0c;那究竟如何使用呢&#xff1f;可以往下了解一下。 1. 什么是 Web Workers&#xff1f; Web Workers 是现代浏览器提供的一种机制&#xff0c;允许我们在主线程之外运行 JavaScript 脚本&#xff0c;避免阻塞 UI 渲染和用户交互操作。…

verilog vscode 与AI 插件

Verilog 轻量化开发环境 背景 笔者常用的开发环境 VIAVDO, 体积巨大&#xff0c;自带编辑器除了linting 能用&#xff0c;编辑器几乎不能用&#xff0c;仿真界面很友好&#xff0c;但是速度比较慢。Sublime Text, 非常好用的编辑器&#xff0c;各种插件使用verilog 非常方便…

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

第二章 Java内存区域与内存溢出异常 2.1 意义 对于C、C程序开发来说&#xff0c;程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制&#xff0c;让java程序员不需要手写delete或者free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;但是如果…

CSGHub携手Nvidia NIM、阿里计算巢打造企业级私有化部署解决方案

强强联合 人工智能与大数据的迅速发展&#xff0c;大模型的推理应用和资产管理已成为企业数字化转型的重要组成部分&#xff0c;企业正寻求高效、安全的AI模型部署解决方案。为应对日益增长的计算需求和复杂的数据管理挑战&#xff0c;CSGHub、Nvidia和阿里云计算巢强强联手&a…

Frozen CLIP: A Strong Backbone for Weakly Supervised Semantic Segmentation

摘要 弱监督语义分割在图像级标签方面取得了巨大的成就。最近的几种方法使用CLIP模型生成伪标签来训练单个分割模型&#xff0c;而没有尝试将CLIP模型作为主干&#xff0c;直接分割具有图像级标签的对象。在本文中&#xff0c;我们提出了 WeCLIP&#xff0c;一个基于 CLIP 的单…

【笔记】自动驾驶预测与决策规划_Part1_自动驾驶决策规划简介

自动驾驶决策规划简介 0、前言1、自动驾驶概述1.1 预测&#xff08;Prediction&#xff09;1.2 决策&#xff08;Decision Making&#xff09;1.3 规划&#xff08;Planning&#xff09; 2、自动驾驶历史和背景3、自动驾驶级别和分类4、预测决策规划的重要性4.1 预测的重要性4.…

环境搭建---部署rabbitmq集群

rabbitmq下载&#xff1a;https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.34/rabbitmq-server-generic-unix-3.8.34.tar.xz erlang下载&#xff1a;https://github.com/erlang/otp/releases/download/OTP-24.3.4.1/otp_src_24.3.4.1.tar.gz 配置主机名 …

MySQL原理之UUID主键分析,插入或更新语法分析

文章目录 1 MySQL不能用UUID做主键1.1 前言1.2 mysql和程序实例1.2.1 准备工作1.2.2 开始测试1.2.3 程序写入结果1.2.4 效率测试结果 1.3 使用uuid和自增id的索引结构对比1.3.1 自增id1.3.2 uuid 1.4 自增id缺点1.5 雪花算法 2 插入或更新2.1 on duplicate key2.1.1 定义2.1.2 …

git版本问题Your branch is behind ‘origin/dev‘by 2 commits,

git版本问题 一个不小心点击了版本的修改&#xff0c;于是就进入了翻滚中&#xff0c;回不来了 遇事还是不要慌&#xff0c;出现这个问题&#xff0c;如果那些你不需要&#xff0c;只是需要回到某一个版本&#xff0c;那么就是需要 git reset --hard origin/master 上面这就…

Vue3入门 - 登录功能开发(Vue3+ts+Pinia+Element Plus)

Vue3中实现登录功能&#xff0c;通常涉及到创建一个表单&#xff0c;用户输入用户名和密码&#xff0c;然后将信息发送到后端进行验证&#xff0c;得到响应结果后作出相应操作。 一、创建项目 这里他用pnpm进行项目的创建的&#xff0c;所以需要事先全局安装pnpm&#xff08;在…

神经网络的非线性激活

文章目录 一、神经网络的非线性激活是什么二、非线性激活常用函数三、非线性激活的实际演示 一、神经网络的非线性激活是什么 神经网络的非线性激活函数的主要作用是引入非线性变换&#xff0c;从而使网络能够学习和逼近复杂的函数关系。在神经网络中&#xff0c;线性变换&…