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;

相关推荐
SmartRadio6 小时前
CH585M+MK8000、DW1000 (UWB)+W25Q16的低功耗室内定位设计
c语言·开发语言·uwb
kylezhao20196 小时前
C#winform数据绑定
c#
rfidunion6 小时前
QT5.7.0编译移植
开发语言·qt
rit84324996 小时前
MATLAB对组合巴克码抗干扰仿真的实现方案
开发语言·matlab
大、男人7 小时前
python之asynccontextmanager学习
开发语言·python·学习
hqwest7 小时前
码上通QT实战08--导航按钮切换界面
开发语言·qt·slot·信号与槽·connect·signals·emit
AC赳赳老秦7 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
不知道累,只知道类8 小时前
深入理解 Java 虚拟线程 (Project Loom)
java·开发语言
国强_dev8 小时前
Python 的“非直接原因”报错
开发语言·python
YMatrix 官方技术社区8 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix