news 2026/6/15 11:42:57

LINQ 基础:常用函数解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LINQ 基础:常用函数解析

在 C# 的世界里,如果说集合是数据的容器,那么LINQ (Language Integrated Query)​ 就是操作这些数据最优雅的瑞士军刀。无论你是处理内存中的对象集合(LINQ to Objects),还是查询数据库(LINQ to SQL),甚至是解析 XML,LINQ 都能让你用一套统一的语法搞定。

今天,我们不谈虚的,直接基于微软官方的 LINQ 架构,重点聊聊LINQ 常用函数的使用方法,以及在查询中如何优雅地使用常数

一、 回顾:LINQ 的两副面孔

在深入函数之前,必须牢记 LINQ 有两种写法,它们编译后的结果是一样的:

  1. 查询语法 (Query Syntax):看着像 SQL,适合复杂的多表关联和分组,可读性强。

  2. 方法语法 (Method Syntax):使用扩展方法 + Lambda 表达式,是目前最流行、最灵活的写法。

示例对比:

假设我们要筛选大于 10 的偶数。

List<int> numbers = new List<int> { 5, 8, 12, 15, 20 }; //1. 查询语法 var queryResult = from n in numbers where n > 10 && n % 2 == 0 select n; //2. 方法语法 (推荐) var methodResult = numbers.Where(n => n > 10 && n % 2 == 0);

接下来的示例,我将主要以方法语法为主,因为它更能体现函数的魅力。

二、 LINQ 核心函数“兵器谱”

LINQ 提供了 50 多个标准查询运算符,我们可以将其分为几大类。掌握这些,你就能应对 90% 的数据处理场景。

1. 筛选界的主角:WhereOfType

Where:按条件过滤

这是最常用的函数,用于筛选出符合条件的元素。

List<Student> students = GetStudents(); //找出所有未成年人 var minors = students.Where(s => s.Age < 18);

OfType:安全的类型筛选
当你面对一个 ArrayList或者 IEnumerable<object>时,OfType能帮你安全地筛选出特定类型的元素,而不会引发异常。

ArrayList mixedList = new ArrayList { "Hello", 123, "World", 456, new Student { Name = "Tom" } }; // 只取出字符串 var strings = mixedList.OfType<string>(); // 结果: ["Hello", "World"] // 只取出 Student 对象 var studentObjects = mixedList.OfType<Student>();

2. 投影界的魔术师:SelectSelectMany

Select:改变输出形态

Select决定了查询结果长什么样。你可以返回原对象,也可以只返回某个属性,甚至可以返回一个新的匿名对象。

// 只获取所有学生的名字 var names = students.Select(s => s.Name); // 返回一个包含姓名和出生年份的新对象 var nameAndBirthYear = students.Select(s => new { s.Name, BirthYear = DateTime.Now.Year - s.Age });

SelectMany:扁平化序列
这是新手最容易困惑但极其强大的函数。当你的集合里嵌套着集合时,SelectMany能将多层结构“压扁”成一层。

List<Class> school = new List<Class> { new Class { Students = new List<string> { "张三", "李四" } }, new Class { Students = new List<string> { "王五", "赵六" } } }; // 使用 Select:得到的是两个 List<string> var selectResult = school.Select(c => c.Students); // 结果: List<string>, List<string> // 使用 SelectMany:得到的是四个 string var selectManyResult = school.SelectMany(c => c.Students); // 结果: "张三", "李四", "王五", "赵六"

3. 排序界的指挥官:OrderByThenBy

排序很简单,但多级排序必须用ThenBy。OrderBy升序,OrderByDesceding降序

List<Product> products = GetProducts(); // 先按类别升序,再按价格降序 var sortedProducts = products .OrderBy(p => p.Category) // 第一排序条件 .ThenByDescending(p => p.Price); // 第二排序条件(仅在类别相同时生效)

4. 分组界的账房先生:GroupBy

GroupBy是数据统计的利器。它根据 Key 将数据进行分组。

// 按类别分组统计 var groupedByCategory = products.GroupBy(p => p.Category); foreach (var group in groupedByCategory) { Console.WriteLine($"类别: {group.Key}"); // Key 就是 Category Console.WriteLine($"数量: {group.Count()}"); Console.WriteLine($"总价: {group.Sum(p => p.Price)}"); }

5. 聚合界的终结者:Count,Sum,Max,Min,Average

这类函数通常放在查询的最后,用来得到一个单一的计算结果。

// 统计成年人数量 int adultCount = students.Count(s => s.Age >= 18); // 计算总销售额 decimal totalSales = orders.Sum(o => o.Amount); // 查找最贵的产品价格 decimal maxPrice = products.Max(p => p.Price); // 计算平均年龄 double avgAge = students.Average(s => s.Age);

三、 总结

LINQ 的强大在于它把数据查询变成了一种面向对象的、强类型的编程体验。

Where负责筛选,Select负责变形,GroupBy负责归类,Aggregate函数负责汇总。

掌握了这些函数的用法,你会发现以前需要写几十行for循环才能完成的逻辑,现在一行 LINQ 就能搞定。这就是代码的“表现力”。

希望这篇博客能帮你更好地驾驭 LINQ!如果你有任何疑问,欢迎在评论区留言讨论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 11:41:53

Nano Banana:细粒度文本-图像对齐技术解析

1. 项目概述&#xff1a;一场被误读的“纳米香蕉”技术革命最近在AI图像生成圈子里&#xff0c;“Nano Banana”这个词像一颗小石子砸进水面&#xff0c;激起一圈又一圈的涟漪。很多人点开标题《This is How Google Finally Fixed AI Images: The Secret Sauce Behind “Nano B…

作者头像 李华
网站建设 2026/6/15 11:32:54

从Notebook到生产:机器学习模型交付的七步工程化实战

1. 项目概述&#xff1a;这不是一次模型训练&#xff0c;而是一场交付实战“From Notebook to Production: Running ML in the Real World (Part 4)”——光看标题&#xff0c;你就能闻到一股混合着Jupyter内核热气、Docker容器日志滚动声和线上监控告警提示音的味道。这不是第…

作者头像 李华
网站建设 2026/6/15 11:28:50

FPGA DDR4用户接口(APP)信号避坑指南:从app_en到app_rd_data_valid的实战解析

FPGA DDR4用户接口信号实战避坑指南&#xff1a;从握手协议到数据延迟的深度解析在FPGA与DDR4存储器的交互设计中&#xff0c;用户接口(APP)信号的正确使用往往是项目成败的关键分水岭。许多开发者虽然理解DDR4的基本原理&#xff0c;却在实现阶段频繁陷入信号时序配合、地址计…

作者头像 李华
网站建设 2026/6/15 11:22:51

AWS原生数据湖构建实战:从S3到Lake Formation的工程化落地

1. 项目概述&#xff1a;为什么今天还在谈“建数据湖”这件事&#xff1f;“Building a Data Lake with AWS”——这个标题乍看像一份云厂商白皮书的副标题&#xff0c;但在我过去十年亲手落地过27个企业级数据平台项目后&#xff0c;它背后藏着一个被严重低估的现实&#xff1…

作者头像 李华