LINQ(Language Integrated Query,语言集成查询)方法是一套封装在.NET 集合(如List<T>、Array)和数据源(如数据库、XML)上的扩展方法,它允许你用统一的、类 SQL 的语法来查询、筛选、排序、转换和聚合数据,无需关心底层数据源的类型。
简单来说,LINQ 方法就是给各种数据集合提供的 "高级操作工具",让你不用写循环、判断就能快速处理数据。
本质:System.Linq.Enumerable类的扩展方法
LINQ 方法主要是Enumerable类中为IEnumerable<T>(所有泛型集合的基接口)定义的扩展方法 ,这意味着几乎所有的泛型集合(List<T>、HashSet<T>、数组等)都能直接调用这些方法。
大部分 LINQ 方法(如Where、Select、OrderBy)是延迟执行 的:调用方法时不会立即执行查询,只有在遍历结果(如foreach、ToList)时才会真正执行。这能提升性能,避免不必要的计算。
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 的语法,用from、where、select等关键字,编译器会自动转换为方法语法。
var studentsAge20 = from s in students
where s.Age == 20
select s;
