C Sharp LINQ 操作符
外观
C# LINQ操作符(Language Integrated Query Operators)是.NET框架中一组强大的查询工具,允许开发者以声明式语法对集合、数据库、XML等数据源进行查询和转换操作。LINQ操作符分为两大类:标准查询操作符(Standard Query Operators)和扩展方法(Extension Methods),它们通过`System.Linq`命名空间提供。
概述[编辑 | 编辑源代码]
LINQ操作符是C# LINQ的核心组成部分,它们定义了如何对数据序列进行筛选、排序、分组、聚合等操作。这些操作符通过链式调用(Fluent Syntax)或查询表达式(Query Expression Syntax)实现,底层基于IEnumerable<T>接口的扩展方法。
LINQ操作符可分为以下几类:
- 筛选操作符(如`Where`)
- 投影操作符(如`Select`)
- 排序操作符(如`OrderBy`)
- 分组操作符(如`GroupBy`)
- 聚合操作符(如`Sum`、`Average`)
- 连接操作符(如`Join`)
- 集合操作符(如`Union`、`Intersect`)
主要LINQ操作符详解[编辑 | 编辑源代码]
1. 筛选操作符(Where)[编辑 | 编辑源代码]
`Where`操作符用于根据条件过滤序列中的元素。
// 示例:筛选偶数
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
// 输出:2, 4
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
2. 投影操作符(Select)[编辑 | 编辑源代码]
`Select`操作符将序列中的每个元素转换为新形式。
// 示例:将数字转换为字符串
var numberStrings = numbers.Select(n => $"Number: {n}");
// 输出:
// Number: 1
// Number: 2
// ...
foreach (var str in numberStrings)
{
Console.WriteLine(str);
}
3. 排序操作符(OrderBy/ThenBy)[编辑 | 编辑源代码]
排序操作符支持多级排序:
// 示例:多条件排序
var people = new[]
{
new { Name = "Alice", Age = 25 },
new { Name = "Bob", Age = 30 },
new { Name = "Charlie", Age = 25 }
};
var sorted = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
// 输出:
// Alice (25), Charlie (25), Bob (30)
foreach (var person in sorted)
{
Console.WriteLine($"{person.Name} ({person.Age})");
}
4. 分组操作符(GroupBy)[编辑 | 编辑源代码]
`GroupBy`创建基于键值的分组序列:
// 示例:按年龄分组
var groups = people.GroupBy(p => p.Age);
foreach (var group in groups)
{
Console.WriteLine($"Age: {group.Key}");
foreach (var person in group)
{
Console.WriteLine($" - {person.Name}");
}
}
5. 聚合操作符[编辑 | 编辑源代码]
常用聚合操作包括`Count`、`Sum`、`Average`等:
// 示例:计算统计值
int[] data = { 10, 20, 30 };
Console.WriteLine($"Count: {data.Count()}"); // 3
Console.WriteLine($"Sum: {data.Sum()}"); // 60
Console.WriteLine($"Average: {data.Average()}"); // 20
延迟执行与立即执行[编辑 | 编辑源代码]
LINQ操作符可分为两类执行方式:
- 延迟执行:查询定义时不立即执行(如`Where`)
- 立即执行:调用时立即返回结果(如`ToList`)
实际应用案例[编辑 | 编辑源代码]
案例1:电商产品筛选[编辑 | 编辑源代码]
// 假设products是商品集合
var filteredProducts = products
.Where(p => p.Price < 100 && p.Category == "Electronics")
.OrderBy(p => p.Price)
.Select(p => new { p.Name, p.Price });
案例2:学生成绩分析[编辑 | 编辑源代码]
// 计算每个班级的平均分
var classAverages = students
.GroupBy(s => s.Class)
.Select(g => new {
Class = g.Key,
Average = g.Average(s => s.Score)
});
高级主题[编辑 | 编辑源代码]
自定义LINQ操作符[编辑 | 编辑源代码]
通过扩展方法创建自定义操作符:
public static IEnumerable<T> WhereGreaterThan<T>(
this IEnumerable<T> source, T threshold) where T : IComparable<T>
{
return source.Where(item => item.CompareTo(threshold) > 0);
}
性能考虑[编辑 | 编辑源代码]
- 避免在循环中重复执行LINQ查询
- 对于大型集合,考虑使用`AsParallel()`进行并行处理
数学基础[编辑 | 编辑源代码]
某些LINQ操作符基于数学概念:
- `Select`对应数学中的解析失败 (语法错误): {\displaystyle 映射函数 f: A \rightarrow B}
- `Where`实现解析失败 (语法错误): {\displaystyle 谓词函数 P: A \rightarrow \{true, false\}}
总结[编辑 | 编辑源代码]
类别 | 操作符示例 |
---|---|
Where, OfType | |
Select, SelectMany | |
OrderBy, ThenBy | |
GroupBy | |
Count, Sum, Average |
掌握LINQ操作符可以显著提高C#开发效率和代码可读性。建议通过实际项目练习来巩固这些概念,并注意不同操作符的性能特性。