LINQ to Objects(IEnumerable)——用于内存对象
目录
List
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);- 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 = 两个门派弟子集合直接串起来
- 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 → 累加