当前位置: 首页 > news >正文

C#:LINQ学习笔记01:LINQ基础概念

一、LINQ 架构体系

1. LINQ 的核心思想

  • 统一查询模型:对对象、XML、数据库等不同数据源使用一致的语法
  • 强类型检查:编译时类型安全,减少运行时错误。

2. 核心组件

技术数据源典型场景
LINQ to Objects内存集合 (IEnumerable)过滤/排序集合数据
LINQ to XMLXML 文档解析/查询 XML 节点
LINQ to SQL关系数据库将查询翻译为 SQL 执行

关键代码示例

// LINQ to Objects
var numbers = new List<int> { 1, 2, 3 };
var query = numbers.Where(n => n > 1);

// LINQ to XML
XDocument doc = XDocument.Load("data.xml");
var elements = doc.Descendants("Book").Where(x => (int)x.Element("Price") > 50);

// LINQ to SQL(伪代码)
var db = new DataContext();
var users = db.Users.Where(u => u.Age > 18);

二、查询表达式 vs 方法语法

1. 本质区别

  • 查询表达式:类 SQL 语法(from...where...select),可读性高。
  • 方法语法:链式调用扩展方法(Where()/Select()),灵活性更强。

2. 转换关系
所有查询表达式会被编译器翻译为方法语法

代码对比

// 查询表达式
var query1 = from num in numbers 
             where num % 2 == 0 
             select num * 2;

// 方法语法
var query2 = numbers
    .Where(num => num % 2 == 0)
    .Select(num => num * 2);

三、IEnumerable 接口解析

1. 核心机制

  • IEnumerable:定义迭代能力(通过 GetEnumerator())。
  • IEnumerator:实现遍历逻辑(MoveNext()Current)。

2. LINQ 的延迟执行

  • 查询定义时不执行,直到迭代结果(如 foreachToList())时才触发。

代码验证延迟执行

var numbers = new List<int> { 1, 2, 3 };
var query = numbers.Select(n => {
    Console.WriteLine($"Processing {n}");
    return n * 2;
});

// 此时无输出
foreach (var num in query) { } // 输出:Processing 1, Processing 2, Processing 3

四、创建首个 LINQ 查询(三步法)

1. 定义数据源

var products = new List<Product> {
    new Product { Name = "Apple", Price = 15 },
    new Product { Name = "Laptop", Price = 5000 },
    new Product { Name = "Book", Price = 80 }
};

2. 编写查询

// 方法语法
var expensiveProducts = products
    .Where(p => p.Price > 100)
    .OrderBy(p => p.Name);

3. 执行查询

foreach (var product in expensiveProducts)
{
    Console.WriteLine(product.Name);
}

五、练习:集合过滤与投影

任务 1:过滤数据

// 数据源
var numbers = Enumerable.Range(1, 100);

// 目标:选出 3 的倍数且大于 50 的数字
var result = numbers.Where(n => n % 3 == 0 && n > 50);

任务 2:投影转换

// 数据源
var persons = new List<Person> { /* 包含姓名和年龄的对象 */ };

// 目标:生成 { Name = "张三", Initial = 'Z' } 形式的新对象
var initials = persons.Select(p => new {
    Name = p.Name,
    Initial = p.Name[0]
});

六、扩展思考
  1. 如何通过 yield return 自定义一个延迟执行的 LINQ 操作?
  2. IQueryableIEnumerable 在查询数据库时的区别?
  3. 如何组合 Where().OrderBy().Select() 实现复杂查询?

http://www.dtcms.com/a/50638.html

相关文章:

  • 品佳诚邀您参加 3/12『英飞凌汽车方案引领智能座舱新纪元』在线研讨会
  • Ubuntu问题 - 在ubuntu上使用 telnet 测试远程的IP:端口是否连通
  • 软考-数据库开发工程师-3.1-数据结构-线性结构
  • 为什么要学习数据结构与算法
  • 修改hosts文件,修改安全属性,建立自己的DNS
  • 如何判断https使用了哪个版本的TLS?
  • 创建 Ubuntu 22.04 USB 启动盘
  • 游戏引擎学习第135天
  • 【RTC】 TM32 RTC(实时时钟)库函数 配置
  • 图生生AI,如何将商品主图的商品替换成自己的商品?
  • CF 452A.Eevee(Java实现)
  • 操作 Redis 常用 shell 脚本
  • 获取哔站评论
  • 【JavaScript — 前端快速入门】 JavaScript 引入方式
  • 全向广播扬声器在油气田中的关键应用 全方位守护安全
  • 充电桩测试负载应用:保障充电安全与性能的核心技术
  • SpringBoot获取YAML配置文件中的属性值(二):使用Environment环境组件读取值
  • 非docker方式部署openwebui过程记录
  • 【MySQL】事务二
  • deepseek助力运维和监控自动化
  • LeetCode 链表章节
  • 深度学习-138-LangGraph之应用实例(七)构建自动绘图系统
  • 3D相机的种类
  • 腾讯云 | 微搭低代码快速开发数据表单应用
  • DFT之SSN架构
  • UniApp如何判断平台的多种方法(2025最新指南)
  • 【大模型学习】第一章 大模型技术综述
  • 2025年渗透测试面试题总结- 阿某云安全实习(题目+回答)
  • 第四节:基于Winform框架的串口助手小项目---开关串口《C#编程》
  • 链表-相关面试算法题