C# Linq 详解四

news2024/11/23 23:59:13

目录

概述

二十、SelectMany

二十一、Aggregate

二十二、DistinctBy

二十三、Reverse

二十四、SequenceEqual

二十五、Zip

二十六、SkipWhile 

二十七、TakeWhile


C# Linq 详解一
1.Where
2.Select
3.GroupBy
4.First / FirstOrDefault
5.Last / LastOrDefault

C# Linq 详解二
1.OrderBy 
2.OrderByDescending
3.Skip
4.Take
5.Any
6.All

C# Linq 详解三
1.Sum / Min / Max / Average
2.Distinct
3.Concat
4.Join
5.ToList 
6.ToArray
7.ToDictionary

C# Linq 详解四
1.SelectMany
2.Aggregate
3.DistinctBy
4.Reverse
5.SequenceEqual
6.Zip
7.SkipWhile 
8.TakeWhile
 

C# Linq 详解一_熊思宇的博客-CSDN博客

C# Linq 详解二_熊思宇的博客-CSDN博客

C# Linq 详解三_熊思宇的博客-CSDN博客

概述

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

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

二十、SelectMany

SelectMany 用于将嵌套的集合展开成一个扁平的序列

这个解释有点难以理解,用案例来解释最好不过了

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<Student> students = new List<Student>
            {
                new Student { Id = 1, Name = "John", Courses = new List<string> { "Math", "English" } },
                new Student { Id = 2, Name = "Jane", Courses = new List<string> { "Science", "History" } },
                new Student { Id = 3, Name = "Mike", Courses = new List<string> { "Art", "Music" } }
            };
            var allCourses = students.SelectMany(s => s.Courses);
            foreach (var course in allCourses)
            {
                Console.WriteLine(course);
            }

            Console.ReadKey();
        }
    }

    class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<string> Courses { get; set; }
    }
}

运行:

二十一、Aggregate

使用指定的累加器函数对序列中的元素进行累积计算。

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = { 1, 2, 3, 4, 5 };
            int sum = numbers.Aggregate((acc, num) => acc + num);
            Console.WriteLine("结果:{0}", sum); 

            Console.ReadKey();
        }
    }
}

运行:

在 Aggregate((acc, num) => acc + num) 这句可以看到,有两个参数,是这样,它是先取两个参数,1 + 2 = 3,第二次再拿 3 + 3 = 6,如此类推,最终的结果等于 15

二十二、DistinctBy

DistinctBy 是一个自定义的扩展方法,它用于按照指定的属性或条件对序列中的元素进行去重操作。

去重操作,看的有点蒙,其实就是去除重复的元素,这个方法用法也是花样很多,可以搜到很多种玩法,只是我基本不用的,哈哈。

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<Person> people = new List<Person>
            {
                new Person { Id = 1, Name = "John" },
                new Person { Id = 2, Name = "Jane" },
                new Person { Id = 3, Name = "John" }
            };

            var distinctPeople = people.DistinctBy(p => p.Name);
            foreach (var person in distinctPeople)
            {
                Console.WriteLine(person.Name);
            }

            Console.ReadKey();
        }
    }

    class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public static class EnumerableExtensions
    {
        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
            this IEnumerable<TSource> source, 
            Func<TSource, TKey> keySelector)
        {
            HashSet<TKey> seenKeys = new HashSet<TKey>();
            foreach (TSource element in source)
            {
                if (seenKeys.Add(keySelector(element)))
                {
                    yield return element;
                }
            }
        }
    }
}

运行:

二十三、Reverse

将序列中的元素按照相反的顺序返回。

这个非常简单,直接上案例

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = { 1, 2, 3, 4, 5 };
            var reversedNumbers = numbers.Reverse();
            foreach (var number in reversedNumbers)
            {
                Console.WriteLine(number);
            }

            Console.ReadKey();
        }
    }
}

运行:

二十四、SequenceEqual

SequenceEqual 用于比较两个序列是否相等。

这个方法,两个数组必须一模一样才会返回 true,而且类型也必须一样

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] numbers1 = { 1, 2, 3, 4, 5 };
            int[] numbers2 = { 1, 2, 3, 4, 5 };
            bool areEqual = numbers1.SequenceEqual(numbers2);
            Console.WriteLine(areEqual); 

            Console.ReadKey();
        }
    }
}

运行:

二十五、Zip

zip 用于将两个序列按照索引位置进行配对。

下面这个案例中,把两个数组一对一进行相加,并根据原来的下标,重新生成了一个新的数组

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] numbers1 = { 1, 2, 3 };
            int[] numbers2 = { 10, 20, 30 };
            var zippedNumbers = numbers1.Zip(numbers2, (n1, n2) => n1 + n2);
            foreach (var number in zippedNumbers)
            {
                Console.WriteLine(number);
            }

            Console.ReadKey();
        }
    }
}

运行:

二十六、SkipWhile 

SkipWhile 用于跳过序列中满足指定条件的元素,直到遇到第一个不满足条件的元素。

注意这里,是不满足条件,下面的案例中,n 指的就是数组中的每个元素,在遍历到 n 不满足  n < 3 这个条件时,才开始返回集合。

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = { 1, 2, 3, 4, 5 };
            var skippedNumbers = numbers.SkipWhile(n => n < 3);
            foreach (var number in skippedNumbers)
            {
                Console.WriteLine(number);
            }

            Console.ReadKey();
        }
    }
}

运行:

二十七、TakeWhile

TakeWhile 用于获取序列中满足指定条件的连续元素,直到遇到第一个不满足条件的元素。

TakeWhile 和 SkipWhile 刚好相反,用起来也是比较简单的。

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

namespace LinqTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = { 1, 2, 3, 4, 5 };
            var takenNumbers = numbers.TakeWhile(n => n < 4);
            foreach (var number in takenNumbers)
            {
                Console.WriteLine(number);
            }

            Console.ReadKey();
        }
    }
}

运行:

end

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

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

相关文章

PMP,一场不可能fail的考试

2018年我参加了PMP考试&#xff0c;结果毫无悬念地轻松通过了。和我一起参加考试的七位伙伴也都取得了不错的成绩。 我是在去年7月份报名的&#xff0c;准备参加9月初的PMP考试。我记得我花费了3800元的培训费和3300元的考试费。由于PMP国内考试的报名条件之一是要求参加过由国…

C++ 指向vector[0]的指针

结论&#xff1a;指针p指向vector的第0个元素 p &v[0] 可以使用p[i]继续访问vector的其他元素&#xff0c;见test3 #include <vector> #include <iostream>/* 测试目的&#xff0c;指针p0指向vector的第0个元素 p &v[0] 可以使用p[i]继续访问vector的…

骨传导耳机好用吗?盘点五款好用的骨传导耳机推荐

在骨传导耳机还没有火之前&#xff0c;相信很多朋友都是使用入耳式和头戴式耳机比较多一点&#xff0c;但是慢慢的会发现&#xff0c;这两种耳机都存在很大的问题&#xff0c;比如说入耳式耳机&#xff0c;长时间佩戴会造成耳朵痛等问题&#xff0c;而头戴式耳机因为隔音效果好…

Spark编程-键值对RDD(K,V)创建及常用操作

简述 SparkRDD中可以包含任何类型的对象&#xff0c;在实际应用中&#xff0c;“键值对”是一种比较常见的RDD元素类型&#xff0c;分组和聚合操作中经常会用到&#xff0c;尤其是groupByKey和reduceByKey。 Spark操作中经常会用到“键值对RDD”&#xff08;Pair RDD&a…

swiper滚动块宽度踩坑记录

背景&#xff1a;需要给swiper增加图片懒加载优化性能&#xff0c;这里使用的是swiper自带的 lazy api。但是加了懒加载后发现滚动块的宽度变长了&#xff0c;这里的原因是我只给滚动条设置了宽度的样式但是没有给滚动块设置宽度的样式。于是我按照官方文档的做法给滚动块设置宽…

STM32单片机语音识别台灯控制系统人检测亮度调节

实践制作DIY- GC00156-语音识别台灯控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别台灯控制系统 二、功能说明&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器 1.任何时候没有人则关闭灯。有人可以自动打开灯。…

LIS检验信息系统

LIS检验信息系统是以病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标&#xff0c;将医学检验、科室管理和财务统计等工作进行整合&#xff0c;全面改善检验科室的工作现状。 LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器&#xff0c;通…

pandas的DataFrame转存MATLAB的mat格式

有的时候需要把 pandas 处理好的 DataFrame 进一步交给MATLAB来处理。当然可以保存成 excel 文件&#xff0c;不过当数据量比较大的时候&#xff0c;读取比较慢&#xff0c;这个时候转存成 MATLAB 可读的 mat 文件更合适&#xff08;MATLAB 能快速读取&#xff09;。 标准的操…

接口自动化测试的最佳工程实践 (ApiTestEngine)

目录 前言&#xff1a; 背景 核心特性 特性拆解介绍 写在后面 前言&#xff1a; 接口自动化测试是现代软件开发中不可或缺的一环。一个良好的测试框架和最佳工程实践可以提高测试效率和质量。 背景 当前市面上存在的接口测试工具已经非常多&#xff0c;常见的如Postman…

建筑结构健康监测常见问题及解决措施

建筑结构健康监测(SHM)是指利用无损传感技术&#xff0c;通过对结构特性进行分析&#xff0c;达到检测结构损伤或退化的目的&#xff0c;是当前守护建筑安全的一种新型技术手段&#xff0c;通过建筑结构健康监测管理者可以直观的了解到建筑物的健康状态&#xff0c;为建筑维护和…

【力扣算法13】之 12. 整数转罗马数字 python

文章目录 问题描述示例1示例2 示例 3:示例 4:示例 5:提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果 完结 问题描述 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符数值I1V5X…

AP5193 DC-DC宽电压LED降压恒流驱动器 LED电源驱动IC

产品 AP5193是一款PWM工作模式、外围简单、内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c;同时…

centos环境搭建nsq集群

简言 1. nsq是go语言开发的实时的分布式消息处理平台&#xff0c;目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和去中心化拓扑结构&#xff0c;该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征 2. nsq官网地址 NSQ Docs 1.2.1 …

【详解】C语言冷门知识点之--位段

文章目录 一&#xff0c; 位段的解释二&#xff0c; 位段的声明和使用位段的声明&#xff1a;位段的使用&#xff1a; 三&#xff0c;位段的空间大小计算第一个例子&#xff1a;第二个例子&#xff1a;注意&#xff1a; 四&#xff0c; 位段的内存分配五&#xff0c;位段的跨平…

@Autowired 到底是怎么把变量注入进来的?

文章目录 1. Bean 的创建2. populateBean3. postProcessProperties3.1 findAutowiringMetadata3.2 inject3.3 doResolveDependency 4. 时序图 在 Spring 容器中&#xff0c;当我们想给某一个属性注入值的时候&#xff0c;有多种不同的方式&#xff0c;例如可以通过构造器注入、…

C++ string类型的基本使用方法

目录 1.定义和初始化string对象 2.string对象上的常用操作 在C中string是用来处理可变长字符串的&#xff0c;是C标准库中提供的类型&#xff0c;使用起来十分方便。同时C也支持C语言的字符数组来表示字符串。使用时记得包含string头文件。 1.定义和初始化string对象&#xf…

讨论下相亲交友小程序介绍红娘系统搭建的功能有哪些

首页内容 同城会员&#xff0c;VIP会员&#xff0c;线下会员&#xff0c;热文推荐&#xff0c;恋爱话术&#xff0c;爱情故事&#xff0c;恋爱宝典&#xff0c;相亲宝典&#xff0c;浪漫约会&#xff0c;相亲活动&#xff0c;地区、年龄筛选&#xff0c;用户动态&#xff0c;用…

(简单)剑指Offer || 056. 二叉搜索树中两个节点的和 Java

方法一&#xff1a;深度优先搜索哈希表 使用深度优先搜索的方式遍历整棵树&#xff0c;用哈希表记录遍历过的节点的值 对于一个值为x的节点&#xff0c;检查哈希表中是否存在k-x即可。如果存在对应的元素&#xff0c;那么我们就可以在该树上找到两个节点的和为k&#xff1b;否…

Idea 修改默认 Maven 为自己的

每次我们打开新项目时,都要去配置一遍 maven,很麻烦,其实可以去修改 idea 里面默认的 maven 配置,这样后面不管是打开新项目还是老项目,就都是用的自己的 maven 了. 1.文件->新项目设置->新项目的设置 File->Other Settings -> Settings for New Project 2.然后和…

【Unity开发必备】100多个 Unity 学习网址 资源 收藏整理大全【持续更新】

Unity 相关网站整理大全 众所周知&#xff0c;工欲善其事必先利其器&#xff0c;有一个好的工具可以让我们事半功倍&#xff0c;有一个好用的网站更是如此&#xff01; 但是好用的网站真的太多了&#xff0c;收藏夹都满满的(但是几乎没打开用过&#x1f601;)。 所以本文是对…