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;

相关推荐
景川呀2 小时前
Java的类加载器
java·开发语言·java类加载器
k***92162 小时前
Python 科学计算有哪些提高运算速度的技巧
开发语言·python
superman超哥2 小时前
仓颉条件变量深度解析与实践:解锁高效并发同步
开发语言·python·c#·仓颉
道法自然|~3 小时前
【PHP】简单的脚本/扫描器拦截与重要文件保护
开发语言·爬虫·php
世洋Blog3 小时前
装饰器模式实践:告别臃肿的继承链,优雅解耦初始化状态管理
unity·设计模式·c#·装饰器模式
GoWjw3 小时前
在C&C++中结构体的惯用方法
c语言·开发语言·c++
静心观复3 小时前
Java 中,`1 << 1`
java·开发语言
Bruce_kaizy3 小时前
c++单调数据结构————单调栈,单调队列
开发语言·数据结构·c++
阿坤带你走近大数据3 小时前
Python基础知识-数据结构篇
开发语言·数据结构·python