常用 LINQ 表达式
| 标准查询运算符 | 说明 | 返回类型 | 立即执行 | 延迟流式处理 | 延迟非流式处理 | 示例 |
|---|---|---|---|---|---|---|
| Where | 筛选满足条件的元素 | IEnumerable<T> |
✅ | list.Where(x => x.Age > 20) |
||
| Select | 投影每个元素 | IEnumerable<T> |
✅ | list.Select(x => x.Name) |
||
| OrderBy | 按升序排序 | IOrderedEnumerable<TElement> |
✅ | list.OrderBy(x => x.Name) |
||
| OrderByDescending | 按降序排序 | IOrderedEnumerable<TElement> |
✅ | list.OrderByDescending(x => x.Age) |
||
| ThenBy | 次级升序排序 | IOrderedEnumerable<TElement> |
✅ | list.OrderBy(x => x.Age).ThenBy(x => x.Name) |
||
| ThenByDescending | 次级降序排序 | IOrderedEnumerable<TElement> |
✅ | list.OrderBy(x => x.Age).ThenByDescending(x => x.Name) |
||
| GroupBy | 按键分组 | IEnumerable<IGrouping<TKey, TElement>> |
✅ | list.GroupBy(x => x.Category) |
||
| First | 获取第一个元素(可带条件) | TSource |
✅ | new[] {1,2,3}.First()→ 1 |
||
| FirstOrDefault | 获取第一个元素或默认值 | TSource? |
✅ | new int[0].FirstOrDefault()→ 0 |
||
| Last | 获取最后一个元素 | TSource |
✅ | new[] {1,2,3}.Last()→ 3 |
||
| LastOrDefault | 获取最后一个元素或默认值 | TSource? |
✅ | new int[0].LastOrDefault()→ null |
||
| Single | 返回唯一元素(否则抛异常) | TSource |
✅ | new[] {5}.Single()→ 5 |
||
| SingleOrDefault | 返回唯一元素或默认值 | TSource? |
✅ | new int[0].SingleOrDefault()→ 0 |
||
| Count | 返回集合中元素的数量 | Int32 |
✅ | new[] {1,2,3}.Count()→ 3 |
||
| Any | 判断集合中是否有满足条件的元素 | Boolean |
✅ | new[] {1,2,3}.Any(x => x > 2)→ true |
||
| All | 判断是否所有元素都满足条件 | Boolean |
✅ | new[] {2,4,6}.All(x => x % 2 == 0)→ true |
||
| Sum | 求和 | 单个数值 | ✅ | new[] {1,2,3}.Sum()→ 6 |
||
| Average | 计算平均值 | 单个数值 | ✅ | new[] {2,4,6}.Average()→ 4.0 |
||
| Max | 获取最大值 | TSource或TResult? |
✅ | new[] {1,3,2}.Max()→ 3 |
||
| Min | 获取最小值 | TSource或TResult? |
✅ | new[] {1,3,2}.Min()→ 1 |
||
| Take | 获取前 N 个元素 | IEnumerable<T> |
✅ | new[] {1,2,3}.Take(2)→ [1,2] |
||
| Skip | 跳过前 N 个元素 | IEnumerable<T> |
✅ | new[] {1,2,3}.Skip(1)→ [2,3] |
||
| TakeWhile | 获取满足条件的连续元素 | IEnumerable<T> |
✅ | new[] {2,4,5,6}.TakeWhile(x => x % 2 == 0)→ [2,4] |
||
| SkipWhile | 跳过满足条件的元素直到遇到不满足的 | IEnumerable<T> |
✅ | new[] {2,4,6,7}.SkipWhile(x => x % 2 == 0)→ [7] |
||
| Distinct | 返回不重复的元素 | IEnumerable<T> |
✅ | new[] {1,1,2}.Distinct()→ [1,2] |
||
| Concat | 连接两个序列 | IEnumerable<T> |
✅ | seq1.Concat(seq2) |
||
| Union | 返回两个集合的并集 | IEnumerable<T> |
✅ | ✅ | seq1.Union(seq2) |
|
| Intersect | 返回两个集合的交集 | IEnumerable<T> |
✅ | ✅ | seq1.Intersect(seq2) |
|
| Except | 返回在第一个集合但不在第二个中的元素 | IEnumerable<T> |
✅ | ✅ | seq1.Except(seq2) |
|
| Contains | 判断集合是否包含某个元素 | Boolean |
✅ | new[] {1,2,3}.Contains(2)→ true |
||
| ElementAt | 获取指定索引位置的元素 | TSource |
✅ | new[] {10,20,30}.ElementAt(1)→ 20 |
||
| ElementAtOrDefault | 获取指定索引元素,若越界则返回默认值 | TSource? |
✅ | new[] {10,20}.ElementAtOrDefault(5)→ null |
||
| DefaultIfEmpty | 如果集合为空,则返回默认值的单元素集合 | IEnumerable<T> |
✅ | emptySeq.DefaultIfEmpty(0) |
||
| Reverse | 反转序列顺序 | IEnumerable<T> |
✅ | new[] {1,2,3}.Reverse()→ [3,2,1] |
||
| ToList | 转换为列表 | IList<T> |
✅ | list.ToList() |
||
| ToArray | 转换为数组 | TSource[] 数组 |
✅ | list.ToArray() |
||
| ToDictionary | 转换为字典 | Dictionary<TKey, TValue> |
✅ | list.ToDictionary(x => x.Id) |
||
| ToLookup | 创建查找表(多值映射) | ILookup<TKey, TElement> |
✅ | list.ToLookup(x => x.Category) |
||
| Cast | 将非泛型集合转换为指定类型的泛型集合 | IEnumerable<T> |
✅ | nonGenericList.Cast<string>() |
||
| AsEnumerable | 强制将非泛型集合转换为泛型 IEnumerable | IEnumerable<T> |
✅ | dataTable.AsEnumerable() |
||
| OfType | 筛选特定类型的元素 | IEnumerable<T> |
✅ | mixedList.OfType<string>() |
||
| Range | 生成一个整数范围的序列 | IEnumerable<T> |
✅ | Enumerable.Range(1,5)→ [1,2,3,4,5] |
||
| Repeat | 重复指定值 N 次 | IEnumerable<T> |
✅ | Enumerable.Repeat("A", 3)→ ["A","A","A"] |
||
| Empty | 返回空的泛型序列 | IEnumerable<T> |
✅ | Enumerable.Empty<int>() |
||
| SequenceEqual | 判断两个序列是否相等 | Boolean |
✅ | seq1.SequenceEqual(seq2) |
||
| Aggregate | 对集合中的元素应用累加函数 | TSource |
✅ | new[] {1,2,3}.Aggregate((a,b) => a + b)→ 6 |
||
| Join | 基于键进行内连接 | IEnumerable<T> |
✅ | ✅ | seq1.Join(seq2, ...) |
|
| GroupJoin | 执行左外连接并按组输出 | IEnumerable<T> |
✅ | ✅ | outer.Join(inner, ...) |
https://learn.microsoft.com/zh-cn/dotnet/csharp/linq/get-started/introduction-to-linq-queries#classification-table
https://www.cnblogs.com/Can-daydayup/p/18824060
