- 什么是淘宝公域流量和私域流量?都有那些?
- 长尾关键词的概念及特征
- 将 WhatsApp 聊天添加到您的网站
- 新站怎样被收录-给站长的建议
- 百度快照相关知识介绍
- php如何是用define让他起到全局的常量的作用
- .net中program.cs
- 不小心把vs(Visual Studio)左边的控件工具栏关掉了
- 50种快速提升网站流量方法
- 微擎的安装与使用方法
邮箱:
手机:15383239821
LINQ基础入门
LINQ(Language Integrated Query,语言集成查询)是 C# 中用于查询集合数据的强大工具,它可以用类似 SQL 的语法操作各种数据(数组、列表、数据库等)。学习 LINQ 可以按 “基础查询→常用操作→实战练习” 的步骤逐步掌握:
第一步:理解为什么需要 LINQ
没有 LINQ 时,操作集合需要写大量循环和判断,代码冗长且可读性差。例如,从列表中筛选出年龄大于 18 的人:
// 传统方式:筛选列表
List<Person> adults = new List<Person>();
foreach (var person in people)
{
if (person.Age > 18)
{
adults.Add(person);
}
}
用 LINQ 实现,代码更简洁直观:
// LINQ方式:一行代码完成筛选
var adults = people.Where(p => p.Age > 18).ToList();
LINQ 的核心优势:简化集合操作代码,提高可读性,支持多种数据源(内存集合、数据库、XML 等)。
第二步:准备工作(引入命名空间和测试数据)
使用 LINQ 需要引入命名空间:
using System.Linq;
// 测试类:表示一个人
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string City { get; set; }
}
// 测试数据:人员列表
List<Person> people = new List<Person>
{
new Person { Name = "张三", Age = 22, City = "北京" },
new Person { Name = "李四", Age = 17, City = "上海" },
new Person { Name = "王五", Age = 25, City = "北京" },
new Person { Name = "赵六", Age = 30, City = "广州" }
};
第三步:学习 LINQ 的两种语法
LINQ 有两种写法,功能完全相同,可根据习惯选择:
1. 方法语法(推荐)
通过扩展方法调用(如Where、Select),更适合链式操作:
// 筛选年龄>18的人
var result = people.Where(p => p.Age > 18);
2. 查询语法(类似 SQL)
用from...where...select等关键字,结构更接近 SQL:
// 同样筛选年龄>18的人(与上面方法语法效果相同)
var result = from p in people
where p.Age > 18
select p;
注意:查询语法最终会被编译为方法语法,两者可以混合使用。
第四步:掌握最常用的 LINQ 操作
从基础操作开始,逐步积累:
1. 筛选(Where)
作用:按条件筛选集合中的元素(类似 SQL 的WHERE)。
// 筛选年龄>18且来自北京的人
var beijingAdults = people
.Where(p => p.Age > 18 && p.City == "北京")
.ToList(); // 转换为List(默认返回IEnumerable,延迟执行)
// 结果:张三(22,北京)、王五(25,北京)
2. 投影(Select)
作用:提取元素的部分属性,或转换为新的类型(类似 SQL 的SELECT)。
// 只提取姓名和年龄,转换为匿名对象
var nameAndAge = people
.Select(p => new { p.Name, p.Age }) // 匿名类型:只包含Name和Age
.ToList();
// 结果:{ Name="张三", Age=22 }, { Name="李四", Age=17 }, ...
3. 排序(OrderBy/ThenBy)
作用:按指定属性排序(OrderBy升序,OrderByDescending降序,ThenBy次要排序)。
// 先按年龄升序,年龄相同再按姓名降序
var sortedPeople = people
.OrderBy(p => p.Age) // 主排序:年龄从小到大
.ThenByDescending(p => p.Name) // 次要排序:姓名从Z到A
.ToList();
// 结果顺序:李四(17)→ 张三(22)→ 王五(25)→ 赵六(30)
4. 聚合(Count/Sum/Average 等)
作用:对集合进行统计计算。
// 统计总人数
int total = people.Count();
// 统计北京的人数
int beijingCount = people.Count(p => p.City == "北京"); // 结果:2
// 计算平均年龄
double avgAge = people.Average(p => p.Age); // 结果:(22+17+25+30)/4 = 23.5
// 计算年龄总和
int totalAge = people.Sum(p => p.Age); // 结果:94
5. 分组(GroupBy)
作用:按指定属性分组(类似 SQL 的GROUP BY)。
// 按城市分组,统计每个城市的人数
var groupByCity = people
.GroupBy(p => p.City) // 按City分组
.Select(g => new
{
City = g.Key, // 分组的键(城市名)
Count = g.Count() // 每组的人数
})
.ToList();
// 结果:
// { City="北京", Count=2 }, { City="上海", Count=1 }, { City="广州", Count=1 }
6. 取前 N 条(Take)和跳过 N 条(Skip)
作用:分页查询常用。
// 取年龄最大的2个人
var top2Ages = people
.OrderByDescending(p => p.Age)
.Take(2) // 取前2条
.ToList(); // 结果:赵六(30)、王五(25)
// 跳过前2条,取剩下的
var skip2 = people
.OrderBy(p => p.Age)
.Skip(2) // 跳过前2条
.ToList(); // 结果:王五(25)、赵六(30)
第五步:理解 LINQ 的 “延迟执行”
LINQ 查询默认是延迟执行的:定义查询时不会立即执行,直到真正需要结果时(如ToList()、Count()、foreach遍历)才会执行。
// 1. 定义查询(此时未执行)
var query = people.Where(p => p.Age > 18);
// 2. 修改数据源(添加一个新的成年人)
people.Add(new Person { Name = "孙七", Age = 20, City = "北京" });
// 3. 执行查询(此时会包含新增的孙七)
var result = query.ToList(); // 结果包含:张三、王五、孙七
立即执行的方法:ToList()、ToArray()、Count()、First()等,会强制查询立即执行并返回结果。
第六步:实战练习(综合案例)
需求:从人员列表中查询 “年龄在 20-30 岁之间,来自北京或上海” 的人,按年龄升序排序,只显示姓名和城市,并统计符合条件的人数。
// 综合查询
var query = people
.Where(p => p.Age >= 20 && p.Age <= 30
&& (p.City == "北京" || p.City == "上海"))
.OrderBy(p => p.Age)
.Select(p => new { p.Name, p.City });
// 执行查询并获取结果
var result = query.ToList();
int count = result.Count;
// 输出
Console.WriteLine($"符合条件的人数:{count}");
foreach (var item in result)
{
Console.WriteLine($"姓名:{item.Name},城市:{item.City}");
}
输出结果:
符合条件的人数:2
姓名:张三,城市:北京
姓名:王五,城市:北京
总结:LINQ 学习路径
1、基础操作:先掌握Where(筛选)、Select(投影)、OrderBy(排序)。
2、统计与分组:学习Count、Average、GroupBy。
3、进阶操作:掌握Take/Skip(分页)、Join(关联查询)等。
4、理解执行机制:区分延迟执行和立即执行,避免数据源修改导致的意外。
- 上一篇:Expression
>与Func 的区别 - 下一篇:Nuxt3简介
-
2024-01-07css去除表格边框重复的方法有哪些
-
2025-03-29el-form中ref的作用
-
2010-09-15RadioButtonList绑定后的默认选项
-
2011-04-18C#中\t和\n分别是什么意思?
-
2010-07-20关键字排名下降处理方法
