C#——LINQ方法

LINQ(Language Integrated Query,语言集成查询)方法是一套封装在.NET 集合(如List<T>Array)和数据源(如数据库、XML)上的扩展方法,它允许你用统一的、类 SQL 的语法来查询、筛选、排序、转换和聚合数据,无需关心底层数据源的类型

简单来说,LINQ 方法就是给各种数据集合提供的 "高级操作工具",让你不用写循环、判断就能快速处理数据。

本质:System.Linq.Enumerable类的扩展方法

LINQ 方法主要是Enumerable类中为IEnumerable<T>(所有泛型集合的基接口)定义的扩展方法 ,这意味着几乎所有的泛型集合(List<T>HashSet<T>、数组等)都能直接调用这些方法。

大部分 LINQ 方法(如WhereSelectOrderBy)是延迟执行 的:调用方法时不会立即执行查询,只有在遍历结果(如foreachToList)时才会真正执行。这能提升性能,避免不必要的计算。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;

// 定义学生类
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public float Score { get; set; }
}

class Program
{
    static void Main()
    {
        // 初始化学生列表
        List<Student> students = new List<Student>
        {
            new Student { Name = "张三", Age = 20, Score = 90.5f },
            new Student { Name = "李四", Age = 19, Score = 85.0f },
            new Student { Name = "王五", Age = 20, Score = 95.0f },
            new Student { Name = "赵六", Age = 21, Score = 80.0f }
        };


    }
}

1.筛选:Where

作用:根据条件筛选数据,返回符合条件的元素(对应 SQL 的WHERE)。

// 筛选年龄为20的学生(Lambda表达式作为条件)

var studentsAge20 = students.Where(s => s.Age == 20);

// 遍历结果(触发延迟执行)

foreach (var s in studentsAge20)

{

Console.WriteLine(s.Name); // 输出:张三、王五

}

2. 筛选/查询:Select

// 筛选年龄为20的学生(Lambda表达式作为条件)

var studentsAge20 = students.Where(s => s.Age == 20);

// 遍历结果(触发延迟执行)

foreach (var s in studentsAge20)

{

Console.WriteLine(s.Name); // 输出:张三、王五

}

3. 排序:OrderBy/ThenBy/OrderByDescending

// 先按年龄升序,再按成绩降序排序

var sortedStudents = students

.OrderBy(s => s.Age)

.ThenByDescending(s => s.Score);

foreach (var s in sortedStudents)

{

Console.WriteLine($"{s.Name}:{s.Age}岁,{s.Score}分");

}

4. 聚合:Count/Sum/Average/Max/Min

作用:对数据进行统计计算,返回单个值(立即执行,不是延迟执行)。

/ 统计学生总数

int total = students.Count();

// 统计年龄20的学生数

int countAge20 = students.Count(s => s.Age == 20);

// 计算成绩的平均值

float avgScore = students.Average(s => s.Score);

// 获取最高成绩

float maxScore = students.Max(s => s.Score);

Console.WriteLine($"总人数:{total},20岁人数:{countAge20},平均成绩:{avgScore},最高成绩:{maxScore}");

5. 限制结果:Take/Skip

作用:Take取前 N 个元素,Skip跳过前 N 个元素(对应 SQL 的TOP/LIMIT)。

// 取前2个学生

var top2 = students.Take(2);

// 跳过前2个,取剩下的

var skip2 = students.Skip(2);

6. 查找:First/FirstOrDefault/Single/SingleOrDefault

作用:查找单个元素,区别在于对匹配数量的要求和无匹配时的行为。

// 取第一个成绩大于90的学生(无匹配会抛异常)

var firstHighScore = students.First(s => s.Score > 90);

// 取第一个成绩大于100的学生(无匹配返回null,不会抛异常)

var firstOrDefault = students.FirstOrDefault(s => s.Score > 100);

// Single:要求只有一个匹配元素,否则抛异常;SingleOrDefault:无匹配返回null,多个匹配抛异常

7. 转换为集合:ToList/ToArray

作用:将 LINQ 查询的结果(IEnumerable<T>)转换为List<T>/ 数组(立即执行),方便后续操作。

// 将筛选结果转换为List(触发延迟执行,并存入内存)

List<Student> age20List = students.Where(s => s.Age == 20).ToList();

LINQ 有两种使用方式:

方法语法:上面的例子都是方法语法,直接调用扩展方法,配合 Lambda 表达式(最常用)。

var studentsAge20 = students.Where(s => s.Age == 20);

查询语法 :类 SQL 的语法,用fromwhereselect等关键字,编译器会自动转换为方法语法。

var studentsAge20 = from s in students

where s.Age == 20

select s;

相关推荐
wangnaisheng5 分钟前
【C#】死锁详解:发生原因、优化解决方案
c#
Rabitebla8 分钟前
vector 的骨架:三根指针、模板陷阱与迭代器失效的第一现场
开发语言·数据结构·c++·算法
时空系9 分钟前
第7篇:功能——打造你的工具箱 Rust中文编程
开发语言·网络·rust
csbysj202017 分钟前
CSS !important:深度解析与最佳实践
开发语言
初心未改HD22 分钟前
Go语言测试与Benchmark:测试驱动开发的实践指南
开发语言·golang
chxii29 分钟前
lua流程控制语句和table(表)数据结构
开发语言·junit·lua
逻辑驱动的ken37 分钟前
Java高频面试考点场景题20
java·开发语言·深度学习·面试·职场和发展
W.A委员会38 分钟前
多行溢出在末尾添加省略号
开发语言·javascript·css
wjs202441 分钟前
RSS Item 元素:深入解析与使用指南
开发语言
tiger从容淡定是人生42 分钟前
AI替代软件战略(一):从 CCleaner 到 MCP 架构重构 —— TigerCleaner 的工程实践
人工智能·重构·架构·c#·mcp