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;

相关推荐
IOsetting几秒前
金山云主机添加开机路由
运维·服务器·开发语言·网络·php
唐梓航-求职中8 分钟前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#
林开落L14 分钟前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
牛奔19 分钟前
Go 是如何做抢占式调度的?
开发语言·后端·golang
符哥200826 分钟前
C++ 进阶知识点整理
java·开发语言·jvm
小猪咪piggy27 分钟前
【Python】(4) 列表和元组
开发语言·python
難釋懷40 分钟前
Lua脚本解决多条命令原子性问题
开发语言·lua
CoderCodingNo1 小时前
【GESP】C++ 二级真题解析,[2025年12月]第一题环保能量球
开发语言·c++·算法
独好紫罗兰1 小时前
对python的再认识-基于数据结构进行-a005-元组-CRUD
开发语言·数据结构·python
chilavert3181 小时前
技术演进中的开发沉思-356:重排序(中)
java·开发语言