常用语法,具体问题具体分析

      • 1. Select
      • 2. SelectMany
      • 3. Where
      • 4. Take
      • 5. TakeWhile
      • 6. SkipWhile
      • 7. Join
      • 8. GroupJoin
      • 9. OrderBy
      • 10. OrderByDescending
      • 11. ThenBy
      • 12. Concat
      • 13. Zip
      • 14. Distinct
      • 15. Except
      • 16. Union
      • 17. Intersect
      • 18. Concat
      • 19. Reverse
      • 20. SequenceEqual
      • 21. ToLookup
      • 22. OfType
      • 23. Cast
      • 24. Range
      • 22. Repeat
      • 25. Prepend
      • 总结

1. Select

将集合中的每个元素投影(转换)为另一种形式。

IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, TResult> selector
);
  • source: 需要投影的源集合。
  • selector: 投影逻辑(Lambda表达式)。
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice", Age = 20 },new Student { Id = 2, Name = "Bob", Age = 22 }
};// 将学生对象投影为只包含姓名和年龄的匿名类型
var namesAndAges = students.Select(s => new { s.Name, s.Age });// 输出:
// { Name = "Alice", Age = 20 }
// { Name = "Bob", Age = 22 }

2. SelectMany

将集合中的每个元素展开为多个元素,然后合并成一个单一的集合。

IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, IEnumerable<TResult>> selector
);
  • 案例
var groups = new List<List<int>>
{new List<int> { 1, 2 },new List<int> { 3, 4 },new List<int> { 5, 6 }
};// 展开所有子列表为一个扁平列表
var flattened = groups.SelectMany(g => g);// 输出:1, 2, 3, 4, 5, 6

3. Where

根据条件筛选集合中的元素,返回满足条件的元素子集。

IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source,Func<TSource, bool> predicate
);
  • source: 需要筛选的源集合。
  • predicate: 筛选条件(Lambda表达式或委托)。
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice", Age = 20 },new Student { Id = 2, Name = "Bob", Age = 22 },new Student { Id = 3, Name = "Charlie", Age = 19 }
};// 筛选出年龄大于20岁的学生
var filtered = students.Where(s => s.Age > 20);// 输出:Bob(Age=22)
  • 进阶用法
    Where 可以结合索引或复杂条件:
// 筛选偶数位置的元素(索引从0开始)
var evenIndices = numbers.Where((n, index) => index % 2 == 0);// 多条件组合(年龄在20到25岁之间)
var filtered = students.Where(s => s.Age >= 20 && s.Age <= 25);

  • 补充说明
    Where 是 LINQ 中最基础且常用的筛选方法,通常与其他方法(如 Select, OrderBy, Take 等)组合使用,构建复杂的查询逻辑。例如:
var query = students.Where(s => s.Age > 20)          // 筛选条件.OrderBy(s => s.Name)            // 排序.Select(s => s.Name)             // 投影.Take(2);                        // 取前2个结果

4. Take

从集合的开头取指定数量的元素。

IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source,int count
);
  • 案例
var numbers = new List<int> { 1, 2, 3, 4, 5 };// 取前3个元素
var firstThree = numbers.Take(3);// 输出:1, 2, 3

5. TakeWhile

从集合的开头开始,取元素直到条件不满足为止。

IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source,Func<TSource, bool> predicate
);
  • 案例
var numbers = new List<int> { 1, 3, 5, 4, 2 };// 取元素直到遇到第一个小于当前元素的数
var taken = numbers.TakeWhile((n, index) => n > numbers[index - 1]);// 输出:1, 3, 5(因为 4 < 5 时停止)

6. SkipWhile

跳过满足条件的元素,直到条件不满足为止,之后返回剩余元素。

IEnumerable<TSource> SkipWhile<TSource>(this IEnumerable<TSource> source,Func<TSource, bool> predicate
);
  • 案例
var numbers = new List<int> { 1, 3, 5, 4, 2 };// 跳过元素直到遇到第一个小于当前元素的数
var skipped = numbers.SkipWhile((n, index) => n > numbers[index - 1]);// 输出:4, 2(从索引3开始)

7. Join

将两个集合通过关联键连接(类似SQL的INNER JOIN)。

IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer,IEnumerable<TInner> inner,Func<TOuter, TKey> outerKeySelector,Func<TInner, TKey> innerKeySelector,Func<TOuter, TInner, TResult> resultSelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice" },new Student { Id = 2, Name = "Bob" }
};var enrollments = new List<Enrollment>
{new Enrollment { StudentId = 1, Course = "Math" },new Enrollment { StudentId = 2, Course = "Physics" }
};var joined = students.Join(enrollments,s => s.Id,e => e.StudentId,(s, e) => new { s.Name, e.Course }
);// 输出:
// { Name = "Alice", Course = "Math" }
// { Name = "Bob", Course = "Physics" }

8. GroupJoin

将两个集合通过关联键连接,并返回分组后的结果(类似SQL的LEFT JOIN)。

IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer,IEnumerable<TInner> inner,Func<TOuter, TKey> outerKeySelector,Func<TInner, TKey> innerKeySelector,Func<TOuter, IEnumerable<TInner>, TResult> resultSelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice" },new Student { Id = 2, Name = "Bob" }
};var enrollments = new List<Enrollment>
{new Enrollment { StudentId = 1, Course = "Math" },new Enrollment { StudentId = 1, Course = "Physics" },new Enrollment { StudentId = 2, Course = "Chemistry" }
};var grouped = students.GroupJoin(enrollments,s => s.Id,e => e.StudentId,(s, es) => new { s.Name, Courses = es.Select(e => e.Course) }
);// 输出:
// { Name = "Alice", Courses = ["Math", "Physics"] }
// { Name = "Bob", Courses = ["Chemistry"] }

9. OrderBy

按升序对集合排序。

IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source,Func<TSource, TKey> keySelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 3, Name = "Charlie" },new Student { Id = 1, Name = "Alice" }
};var sorted = students.OrderBy(s => s.Id);// 输出:按Id升序排列的列表

10. OrderByDescending

按降序对集合排序。

IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(this IEnumerable<TSource> source,Func<TSource, TKey> keySelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 3, Name = "Charlie" },new Student { Id = 1, Name = "Alice" }
};var sorted = students.OrderByDescending(s => s.Id);// 输出:按Id降序排列的列表

11. ThenBy

在已有排序的基础上进行二次排序。

IOrderedEnumerable<TSource> ThenBy<TSource, TKey>(this IOrderedEnumerable<TSource> source,Func<TSource, TKey> keySelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice", Age = 20 },new Student { Id = 2, Name = "Bob", Age = 20 }
};var sorted = students.OrderBy(s => s.Age).ThenBy(s => s.Name);// 先按年龄排序,再按姓名排序

12. Concat

将两个集合连接成一个集合。

IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2 };
var list2 = new List<int> { 3, 4 };var concatenated = list1.Concat(list2);// 输出:1, 2, 3, 4

13. Zip

将两个集合按元素顺序配对,直到较短的集合结束。

IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first,IEnumerable<TSecond> second,Func<TFirst, TSecond, TResult> resultSelector
);
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<string> { "a", "b" };var zipped = list1.Zip(list2, (n, s) => $"{n}-{s}");// 输出:["1-a", "2-b"](较短的集合决定长度)

14. Distinct

返回集合中唯一(不重复)的元素。

IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source
);
  • 案例
var numbers = new List<int> { 1, 2, 2, 3 };var distinct = numbers.Distinct();// 输出:1, 2, 3

15. Except

返回第一个集合中存在但不在第二个集合中的元素。

IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 2, 3, 4 };var except = list1.Except(list2);// 输出:1(list1中有但不在list2中的元素)

以下是关于 Union, IntersectConcat 的详细说明,补充到之前的 LINQ 方法列表中:


16. Union

返回两个集合的并集(去重后的所有元素)。

IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • first: 第一个集合。
  • second: 第二个集合。
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 3, 4, 5 };var union = list1.Union(list2);// 输出:1, 2, 3, 4, 5(去重后的并集)
  • 进阶用法
    可自定义比较器:
var unionWithComparer = list1.Union(list2, StringComparer.OrdinalIgnoreCase);

17. Intersect

返回两个集合的交集(同时存在于两个集合的元素)。

IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 3, 4, 5 };var intersect = list1.Intersect(list2);// 输出:3(唯一共同元素)
  • 进阶用法
    自定义比较器:
var intersectWithComparer = list1.Intersect(list2, StringComparer.OrdinalIgnoreCase);

18. Concat

将两个集合连接成一个集合(保留重复元素,顺序为 first 后接 second)。

IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2 };
var list2 = new List<int> { 2, 3 };var concatenated = list1.Concat(list2);// 输出:1, 2, 2, 3(保留重复元素)
  • 对比总结
方法功能是否去重示例
Union并集(去重){1,2} ∪ {2,3} → {1,2,3}
Intersect交集(共同元素){1,2} ∩ {2,3} → {2}
Concat连接(保留重复,顺序拼接){1,2} + {2,3} → {1,2,2,3}

19. Reverse

反转集合的顺序。

IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source
);
  • 案例
var numbers = new List<int> { 1, 2, 3 };var reversed = numbers.Reverse();// 输出:3, 2, 1

20. SequenceEqual

比较两个集合的元素是否完全相同(顺序和内容)。

bool SequenceEqual<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second
);
  • 案例
var list1 = new List<int> { 1, 2, 3 };
var list2 = new List<int> { 1, 2, 3 };var equal = list1.SequenceEqual(list2); // truevar list3 = new List<int> { 1, 2 };
var notEqual = list1.SequenceEqual(list3); // false

21. ToLookup

将集合转换为 ILookup<TKey, TElement>,按键分组。

ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(this IEnumerable<TSource> source,Func<TSource, TKey> keySelector,Func<TSource, TElement> elementSelector
);
  • 案例
var students = new List<Student>
{new Student { Id = 1, Name = "Alice", Age = 20 },new Student { Id = 2, Name = "Bob", Age 20 }
};var lookup = students.ToLookup(s => s.Age, s => s.Name);// 查询年龄为20的姓名列表:
var names = lookup[20]; // ["Alice", "Bob"]

22. OfType

过滤集合中符合指定类型的元素。

IEnumerable<TResult> OfType<TResult>(this IEnumerable source
);
  • 案例
var mixedList = new object[] { 1, "text", 3.14 };var numbers = mixedList.OfType<int>();// 输出:1(只保留int类型)

23. Cast

强制转换集合中所有元素为指定类型。

IEnumerable<TResult> Cast<TResult>(this IEnumerable source
);
  • 案例
var mixedList = new object[] { 1, "text", 3.14 };var strings = mixedList.Cast<string>(); // 抛出异常,因为包含非字符串类型

24. Range

生成一个指定范围的整数序列。

IEnumerable<int> Range(int start,int count
);
  • 案例
var numbers = Enumerable.Range(1, 5); // 生成1到5的整数// 输出:1, 2, 3, 4, 5

22. Repeat

生成指定次数的重复元素序列。

IEnumerable<TSource> Repeat<TSource>(TSource element,int count
);
  • 案例
var repeated = Enumerable.Repeat("Hello", 3);// 输出:["Hello", "Hello", "Hello"]

25. Prepend

在集合的开头添加一个元素。

IEnumerable<TSource> Prepend<TSource>(this IEnumerable<TSource> source,TSource element
);
  • 案例
var numbers = new List<int> { 2, 3 };
var prepended = numbers.Prepend(1);// 输出:1, 2, 3

总结

  • Projection(投影): Select, SelectMany
  • Filtering(过滤): Take, TakeWhile, SkipWhile, Where
  • Joins(连接): Join, GroupJoin
  • Sorting(排序): OrderBy, OrderByDescending, ThenBy
  • Combining(结合): Concat, Zip
  • Set Operations(集合操作): Distinct, ExceptUnion‌Intersect‌Concat‌ 去重、并集、交集、差集和连接‌
  • Transformation(转换): Reverse, ToLookup, OfType, Cast, Range, Repeat, Prepend

注意:
‌性能问题‌:不当使用LINQ可能会导致性能下降,尤其是在处理大数据集时。建议尽早使用Where来过滤数据,减少后续操作的数据量‌
‌过早枚举‌:当使用foreach循环遍历LINQ查询结果时,如果查询结果是一个延迟执行的序列(如IEnumerable),那么查询会在第一次遍历时被执行‌

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

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

相关文章

华为OD-2024年E卷-小明周末爬山[200分] -- python

问题描述&#xff1a; 题目描述 周末小明准备去爬山锻炼&#xff0c;0代表平地&#xff0c;山的高度使用1到9来表示&#xff0c;小明每次爬山或下山高度只能相差k及k以内&#xff0c;每次只能上下左右一个方向上移动一格&#xff0c;小明从左上角(0,0)位置出发 输入描述 第一行…

Android:使用OkHttp

1、权限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> implementation com.squareup.okhttp3:okhttp:3.4.1 2、GET&#xff1a; new XXXTask ().execute("http://192.168.191.128:9000/xx");private class XXXTask…

Vue3+Element Plus动态表格列宽设置

在 Vue3 Element Plus 中实现动态设置表格列宽&#xff0c;可以通过以下几种方式实现&#xff1a; 方法 1&#xff1a;动态绑定 width 属性&#xff08;推荐&#xff09; vue 复制 下载 <template><el-table :data"tableData" style"width: 100%…

【JVM目前使用过的参数总结】

JVM参数总结 笔记记录 JVM-栈相关JVM-方法区(元空间)相关JVM-堆相关 JVM-栈相关 .-XX:ThreadStackSize1M -Xss1m 上面的简写形式【设置栈的大小】 JVM-方法区(元空间)相关 -XX:MaxMetaspaceSize10m 【设置最大元空间大小】 JVM-堆相关 -XX:MaxHeapSize10m -Xmx10m 上面的简写形…

AI辅助高考志愿填报-专业全景解析与报考指南

高考志愿填报&#xff0c;这可是关系到孩子未来的大事儿&#xff01;最近&#xff0c;我亲戚家的孩子也面临着这个难题&#xff0c;昨晚一个电话就跟我聊了好久&#xff0c;问我报啥专业好。说实话&#xff0c;这问题真不好回答&#xff0c;毕竟每个孩子情况不一样&#xff0c;…

Android Studio Windows安装与配置指南

Date: 2025-06-14 20:07:12 author: lijianzhan 内容简介 文章中&#xff0c;主要是为了初次接触 Android 开发的用户提供详细的关于 Android Studio 安装以及配置教程&#xff0c;涵盖环境准备、软件下载、安装配置全流程&#xff0c;重点解决路径命名、组件选择、工作空间设置…

SpringAI+DeepSeek-了解AI和大模型应用

一、认识AI 1.人工智能发展 AI&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;使机器能够像人类一样思考、学习和解决问题的技术。 AI发展至今大概可以分为三个阶段&#xff1a; 其中&#xff0c;深度学习领域的自然语言处理(Natural Lan…

IP5362至为芯支持无线充的22.5W双C口双向快充移动电源方案芯片

英集芯IP5362是一款应用于移动电源&#xff0c;充电宝&#xff0c;手机&#xff0c;平板电脑等支持无线充模式的22.5W双向快充移动电源方案SOC芯片,集成同步升降压转换器、锂电池充电管理、电池电量指示等功能。兼容全部快充协议&#xff0c;同步开关放电支持最大22.5W输出功率…

手游刚开服就被攻击怎么办?如何防御DDoS?

手游新上线时遭遇DDoS攻击是常见现象&#xff0c;可能导致服务器瘫痪、玩家流失甚至项目失败。面对突如其来的攻击&#xff0c;开发者与运营商需要迅速响应并建立长效防御机制。本文提供应急处理步骤与防御策略&#xff0c;助力游戏稳定运营。 一、手游开服遭攻击的应急响应 快…

秋招是开发算法一起准备,还是只准备一个

THE LAST TIME 昨天晚上半夜有个星球的26届的同学&#xff0c;私信问我。说目前是只准备开发还是开发算法一起准备&#xff08;两者技术知识都挺欠缺的&#xff09; 看到这里&#xff0c;肯定有很多同学会说。马上都该秋招了&#xff0c;还什么多线程开工&#xff0c;赶紧能住编…

web项目部署配置HTTPS遇到的问题解决方法

今天使用nginxtomcatssl完成了web项目的部署&#xff0c;本以为没有什么问题&#xff0c;但是在页面测试的时候又蹦出了这么一个问题&#xff0c;大致是说由于配置了HTTPS&#xff0c;但是之前的请求是通过HTTP请求的&#xff0c;所以现在被拦截&#xff0c;由于缺少某些权限信…

理解与建模弹性膜-AI云计算数值分析和代码验证

弹性膜在连接生物学理解和工程创新方面至关重要&#xff0c;因为它们能够模拟软组织力学、实现先进的细胞培养系统和促进柔性设备&#xff0c;广泛应用于软组织生物力学、细胞培养、生物膜建模和生物医学工程等领域。 ☁️AI云计算数值分析和代码验证 弹性膜在连接生物学理解和…

AI大模型竞赛升温:百度发布文心大模型4.5和X1

AI大模型&#xff0c;作为智能技术的巅峰之作&#xff0c;正逐步改变着我们的生活与工作方式。近期&#xff0c;百度在AI大模型领域的最新动向&#xff0c;无疑为这场科技竞赛再添一把火。3月16日&#xff0c;百度正式宣布发布文心大模型4.5及文心大模型X1&#xff0c;这两款大…

升级OpenSSL和OpenSSH 修复漏洞

升级OpenSSL和OpenSSH 目前版本OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 升级到OpenSSH_9.8p1, OpenSSL 1.1.1u 30 May 2023 服务器CentOS Linux release 7.6.1810 (Core) 一、升级OpenSSL到1.1.1u 下载并编译 OpenSSL&#xff08;推荐目录 /usr/local/openssl&…

JavaSE - Object 类详细讲解

定义 是所有类的直接或者间接父类&#xff0c;是 Java 中唯一一个没有父类的类。其中所有的方法都是可以被子类继承的。 常用方法 equals方法&#xff1a; 比较两个对象引用的地址值是否相同&#xff0c;默认情况下是使用 “” 进行比较&#xff0c;但是这个方法一般会被之类…

观远ChatBI|让数据分析像聊天一样简单

BI通过收集、整合和分析企业内部的各种数据&#xff0c;帮助企业发现数据中的模式和趋势&#xff0c;从而做出更明智的商业决策&#xff0c;以此来提升企业的经营能力和竞争力。无论是传统BI还是自助BI&#xff0c;都是为了在数据和人之间建立一座桥梁&#xff0c;使数据能够被…

Go语言同步原语与数据竞争:WaitGroup

在Go语言并发编程中&#xff0c;我们经常需要等待多个 goroutine 执行完毕后再继续下一步操作。Go 提供的 sync.WaitGroup 就是专为这种**“等待一组任务完成”**而设计的同步原语。 一、基本原理 sync.WaitGroup 提供三个主要方法&#xff1a; 方法说明Add(n int)设置等待的…

Java单体架构 vs 分布式架构

Java单体架构 vs 分布式架构 在电商系统开发中&#xff0c;当用户量从几百激增到百万级&#xff0c;你的架构是否还能从容应对&#xff1f;一次代码更新是否意味着整个系统停机&#xff1f;今天我们就来拆解Java架构设计的核心命题&#xff1a;单体还是分布式&#xff1f; 一、…

day40- 硬件学习之 51单片机II (中断处理)

一、独立按键的使用 main.c key.c key.h 二、中断处理 2.1 定义 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。 当CPU正在处理某件事的时候外界发生了紧急事件请求&#xff0c;要求CPU暂停当前的工作&#xff0c;转而去处理这个紧急事件&#xff0c;处理完以…

机器学习:开启智能时代的大门

一、引言 机器学习&#xff08;Machine Learning&#xff09;正成为人工智能的核心技术。从 Netflix 推荐电影&#xff0c;到银行识别欺诈交易&#xff0c;机器学习正在逐渐改变世界。本篇文章将从理论到实操全面介绍机器学习的基础概念&#xff0c;并附有代码和案例。 二、什…