C#的LINQ查询是什么?如何使用?

来源:3D模型作者:灯下变量头衔:程序员
导读:本期聚焦于小伙伴创作的《C#的LINQ查询是什么?如何使用?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#的LINQ查询是什么?如何使用?》有用,将其分享出去将是对创作者最好的鼓励。

C#的LINQ全称是语言集成查询,是C# 3.0及之后版本引入的核心特性,它把查询能力直接集成到C#编程语言中,让开发者可以用类似SQL的语法对不同类型的数据源进行查询操作,不需要为不同数据源学习不同的查询语法。

C#的LINQ查询是什么?如何使用?

LINQ的核心概念

LINQ的本质是一组扩展方法,主要基于IEnumerable<T>接口实现,所以只要实现了该接口的数据源都可以使用LINQ操作。它的核心优势主要体现在三个方面:

  • 语法统一:不管是操作内存中的集合、数据库表还是XML文档,都可以用相同的查询语法,降低学习成本
  • 类型安全:查询过程中会进行编译时类型检查,减少运行时错误
  • 延迟执行:大部分LINQ查询不会立即执行,只有在遍历结果时才会真正执行查询逻辑,提升性能

LINQ的两种使用语法

LINQ提供了两种常用的语法形式,分别是查询语法和方法语法,两者功能等价,开发者可以根据习惯选择使用。

1. 查询语法

查询语法类似SQL的写法,可读性更强,适合简单的查询场景。基本结构是从数据源中获取数据,设置筛选条件,最后选择需要的字段。

下面是一个从整数集合中筛选偶数的示例:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // 定义数据源
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        
        // LINQ查询语法:筛选偶数
        var evenNumbers = from num in numbers
                          where num % 2 == 0
                          select num;
        
        // 遍历输出结果
        Console.WriteLine("筛选出的偶数:");
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}

2. 方法语法

方法语法是通过调用LINQ的扩展方法实现查询,适合复杂逻辑的场景,很多时候比查询语法更灵活。上面的筛选偶数示例用方法语法可以写成如下形式:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        
        // LINQ方法语法:筛选偶数,使用Lambda表达式作为条件
        var evenNumbers = numbers.Where(num => num % 2 == 0);
        
        Console.WriteLine("筛选出的偶数:");
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}

常见LINQ操作示例

排序操作

使用OrderByOrderByDescending可以对结果进行排序,下面的示例对学生列表按年龄升序排序:

using System;
using System.Collections.Generic;
using System.Linq;

class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Student> students = new List<Student>
        {
            new Student { Name = "张三", Age = 20 },
            new Student { Name = "李四", Age = 18 },
            new Student { Name = "王五", Age = 22 }
        };
        
        // 按年龄升序排序
        var sortedStudents = students.OrderBy(s => s.Age);
        
        Console.WriteLine("按年龄升序排序后的学生:");
        foreach (var student in sortedStudents)
        {
            Console.WriteLine($"姓名:{student.Name},年龄:{student.Age}");
        }
    }
}

投影操作

使用Select可以对查询结果进行投影,转换数据的形状,比如只获取学生的姓名:

using System;
using System.Collections.Generic;
using System.Linq;

class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Student> students = new List<Student>
        {
            new Student { Name = "张三", Age = 20 },
            new Student { Name = "李四", Age = 18 }
        };
        
        // 投影操作:只获取学生姓名
        var studentNames = students.Select(s => s.Name);
        
        Console.WriteLine("所有学生姓名:");
        foreach (var name in studentNames)
        {
            Console.WriteLine(name);
        }
    }
}

使用注意事项

  • 延迟执行特性:如果查询之后数据源发生了变化,再次遍历查询结果时会得到最新的数据,不需要重新执行查询
  • 立即执行:如果需要立即获取查询结果,可以调用ToListToArray等方法,把结果转换为集合,避免后续数据源变化影响结果
  • 空值处理:如果数据源可能为null,需要先做非空判断,否则调用LINQ方法会抛出空引用异常

LINQC#IEnumerableLambda_表达式修改时间:2026-07-14 08:03:10

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。