跳转到内容

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操作符可分为两类执行方式:

graph LR A[LINQ操作] --> B[延迟执行] A --> C[立即执行] B --> D[Where/Select等] C --> E[Count/ToList等]

  • 延迟执行:查询定义时不立即执行(如`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\}}

总结[编辑 | 编辑源代码]

LINQ操作符分类表
类别 操作符示例
Where, OfType
Select, SelectMany
OrderBy, ThenBy
GroupBy
Count, Sum, Average

掌握LINQ操作符可以显著提高C#开发效率和代码可读性。建议通过实际项目练习来巩固这些概念,并注意不同操作符的性能特性。