常用 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