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;

相关推荐
傻啦嘿哟5 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670795 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄6 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh6 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei7 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界7 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨8 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J8 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥9 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk5559 小时前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python