C#如何使用LINQ查询集合 C# LINQ常用查询语法教程

5次阅读

linq 用声明式语法替代循环,提升可读性;核心是掌握 where/select(筛选与投影)、orderby/skip/take(排序分页)、count/any/all(聚合判断)、distinct/union/except/intersect(集合操作),且具延迟执行特性。

C#如何使用LINQ查询集合 C# LINQ常用查询语法教程

用 LINQ 查询集合,核心是用声明式语法替代传统 for/foreach 循环,让代码更简洁、可读性更高。重点不是记所有方法,而是掌握常用查询操作符和它们的适用场景。

基础查询:where + select 最常用

筛选加投影是最常见的组合。where 过滤元素,select 提取或转换数据。

  • where 接布尔表达式,返回满足条件的元素;支持链式调用多个 where(等价于 AND)
  • select 可返回原对象、新匿名对象、单一属性,甚至做简单计算

示例:

var adults = people.Where(p => p.Age >= 18).Select(p => new { p.Name, p.Age });

排序与分页:orderby + Skip/Take

orderby 默认升序,加 descending 可降序;多级排序用逗号分隔;Skip 和 Take 常用于分页。

  • orderby p.Age descending, p.Name 升序排姓名(同年龄时)
  • Take(10) 取前10条;Skip(20).Take(10) 表示第3页(每页10条)

注意:Skip/Take 在数据库查询中会转成 sql 的 OFFSET/FETCH,但对内存集合会先加载再跳过,大数据量慎用。

聚合与判断:Count/Sum/Any/All

这些方法直接返回单个值,不返回 IEnumerable,常用于条件检查或统计。

  • Count() 返回总数;Count(x => x.IsActive) 统计满足条件的数量
  • Any() 判断是否存在匹配项(比 Count > 0 更高效,找到第一个就返回)
  • All() 判断是否全部满足条件;Sum/Max/Min/Average 适用于数值类型

示例:bool hasAdmin = users.Any(u => u.Role == “Admin”);

集合操作:Distinct/Union/Except/Intersect

处理重复或比较两个集合时很实用,都基于默认相等比较器(或自定义 IEqualityComparer)。

  • Distinct() 去重;对引用类型需重写 Equals/GetHashCode 或传入比较器
  • Union() 并集(自动去重);Intersect() 交集;Except() 差集(左有右无)

示例:var allTags = post1.Tags.Union(post2.Tags);

基本上就这些。LINQ 查询本身不执行,直到你调用 ToList()、ToArray()、First() 或遍历 foreach 时才触发(延迟执行)。写的时候多用 var,少想类型,让编译器帮你推导。

text=ZqhQzanResources