目录

LINQ to Objects(IEnumerable)——用于内存对象

List, T[ ], Dictionary, Queue, 任何实现了IEnumerable 的集合

1. Where —— 过滤(筛选)

用途: 过滤满足条件的数据。

武侠理解:

你有一批弟子,你只留下“悟性大于80的弟子”。Where = 筛人。

示例:

var highScore = students.Where(s => s.Score > 80);

特点:

  • 不改变原集合
  • 延迟执行(不会立即执行)

2. Select —— 投影(取字段、转形状)

用途: 把集合中的元素转换成新的东西。

武侠理解:

你从弟子身上只取“名字”和“武力值”,或者把弟子变成“弟子战力卡”。

示例:

var names = students.Select(s => s.Name);

特点:

  • 非常核心
  • 和 SQL 的 SELECT 是一回事

3. SelectMany —— 扁平化(展开)

每当你“集合里还有集合”,就要用它。

武侠理解:

每个师门里有多个弟子,你想获得所有弟子,不想嵌套结构 → 就展开。

示例:

var allStudents = schools.SelectMany(s => s.Students);

4. OrderBy / OrderByDescending —— 排序

武侠理解:

按弟子实力给你排座次。

示例:

var sorted = students.OrderBy(s => s.Score);

5. ThenBy / ThenByDescending —— 二级、三级排序

武侠理解:

实力相同,再按年龄排序。

示例:

students.OrderBy(s => s.Score).ThenBy(s => s.Age);
  1. First, FirstOrDefault, Single, SingleOrDefault**

容易混淆,我帮你一次搞懂。

方法结果如果没有数据First返回第一个❌ 抛异常FirstOrDefault返回第一个✔️ 返回 default(T)Single必须只有 1 个❌ 不等于 1 就报错SingleOrDefault必须 0 或 1 个✔️ 0个时返回default,多个时报错

武侠理解:

  • First:给我这个门派“第一个弟子”。
  • Single:这个门派只能有“一个掌门人”,多一个就出事。

7. Any / All

非常常用。

Any:是否存在符合条件的元素

武侠理解:

是否有弟子悟性大于 90?

示例:

students.Any(s => s.Score > 90);

All:所有元素是否都符合条件

武侠理解:

所有弟子都及格了吗?

students.All(s => s.Score >= 60);

8. Count / LongCount

武侠理解:

统计弟子人数。

示例:

students.Count();
students.Count(s => s.Score > 90);

9. Sum / Min / Max / Average

武侠理解:

统计弟子实力总和、最大武力。

示例:

var total = students.Sum(s => s.Score);
var max = students.Max(s => s.Score);

10. GroupBy —— 分组(非常常用)

武侠理解:

按门派把弟子分组。

示例:

var groups = students.GroupBy(s => s.School);

11. Take / Skip —— 分页基础

武侠比喻:

弟子排队练武,你只让前 10 个上场 → Take(10)
跳过前面 10 个,剩下的弟子继续 → Skip(10)

示例:

var top10 = students.OrderByDescending(s => s.Score).Take(10);
var page2 = students.OrderByDescending(s => s.Score).Skip(10).Take(10);

特点:

  • Take + Skip = 分页的基础
  • 一定要先 OrderBy,否则分页顺序不确定

12. Distinct —— 去重

武侠比喻:

弟子中有重复名字的,把重复的去掉,只留下唯一的名字。

示例:

var names = students.Select(s => s.Name).Distinct();

注意事项:

  • Distinct 默认比较对象引用
  • 对于自定义类型,需要实现 IEquatable<T> 或自定义比较器

13. Union / Intersect / Except —— 集合运算

武侠比喻:

  • Union:两个门派弟子合并,不重复
  • Intersect:两个门派都有的弟子
  • Except:一个门派有,另一个没有的弟子

示例:

var a = new List<string> { "张三", "李四" };
var b = new List<string> { "李四", "王五" };

var union = a.Union(b);      // 张三, 李四, 王五
var intersect = a.Intersect(b); // 李四
var except = a.Except(b);    // 张三

14. Reverse / Concat

  • Reverse倒序排列
students.Reverse();
  • Concat连接两个集合(不去重)
var all = list1.Concat(list2);

武侠比喻:

  • Reverse = 练武顺序倒过来
  • Concat = 两个门派弟子集合直接串起来
  1. ToList / ToArray / ToDictionary**

把 LINQ 查询结果转换成常用集合:

var list = query.ToList();
var array = query.ToArray();
var dict = query.ToDictionary(s => s.Id, s => s.Name);

武侠比喻:

把筛选好的弟子抓进新的队列、阵型或者编号表里

16. Aggregate —— 聚合运算

武侠比喻:

把所有弟子的武力值累加,得到门派总战力

示例:

int totalScore = students.Select(s => s.Score).Aggregate((a, b) => a + b);

注意:

  • Aggregate 可以自定义累加逻辑
  • 功能比 Sum 更强大

记忆口诀(武侠版 LINQ to Objects)

Where → 筛人
Select → 换装
SelectMany → 展开
OrderBy → 排座
ThenBy → 二级排序
First/Single → 找人
Any/All → 判断
Count/Sum/Min/Max → 统计
GroupBy → 分门派
Take/Skip → 上场/跳过
Distinct → 去重
Union/Intersect/Except → 合并/交集/差集
Reverse/Concat → 倒序/合并
ToList/ToArray/ToDictionary → 收集
Aggregate → 累加