1. 引言
LINQ (Language Integrated Query) 是.NET平台上一种强大的数据查询和操作技术,它为我们提供了一种统一的方式来处理各种数据源,如内存中的集合、数据库、XML文件等。LINQ通过集成到C#语言中,使得数据查询变得更加直观、简洁和类型安全。在上一篇基础介绍之后,本文将深入探讨LINQ的高级查询操作,重点介绍聚合操作、元素操作、集合操作和分区操作。
2. 聚合操作
聚合操作是LINQ中用于对集合数据进行计算和汇总的一类操作,主要包括Sum、Count、Min、Max和Average等。这些操作通常用于计算序列的统计数据,它们不返回序列,而是返回单个值。
2.1 Sum - 计算总和
Sum操作用于计算数值序列的总和,它可以直接应用于数值序列,也可以通过选择器函数对对象序列中的特定属性进行求和。
// 准备示例数据
List<int> numbers = new List<int> {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List<Product> products = new List<Product>
{
new Product {
Id = 1, Name = "笔记本电脑", Price = 5999, Category = "电子产品" },
new Product {
Id = 2, Name = "手机", Price = 3999, Category = "电子产品" },
new Product {
Id = 3, Name = "耳机", Price = 999, Category = "配件" },
new Product {
Id = 4, Name = "移动硬盘", Price = 499, Category = "配件" },
new Product {
Id = 5, Name = "平板电脑", Price = 2999, Category = "电子产品" }
};
// 计算整数序列的总和
int sum = numbers.Sum();
Console.WriteLine($"数字序列总和: {
sum}"); // 输出: 55
// 计算产品价格总和
decimal totalPrice = products.Sum(p => p.Price);
Console.WriteLine($"所有产品总价: {
totalPrice}"); // 输出: 14495
// 计算特定类别产品价格总和
decimal electronicsTotalPrice = products
.Where(p => p.Category == "电子产品")
.Sum(p => p.Price);
Console.WriteLine($"电子产品总价: {
electronicsTotalPrice}"); // 输出: 12997
2.2 Count - 计算元素数量
Count操作用于计算序列中元素的数量,既可以计算总数,也可以计算满足特定条件的元素数量。
// 计算序列中元素总数
int count = numbers.Count();
Console.WriteLine($"数字序列元素数量: {
count}"); // 输出: 10
// 计算满足条件的元素数量(偶数)
int evenCount = numbers.Count(n => n % 2 == 0);
Console.WriteLine($"偶数数量: {
evenCount}"); // 输出: 5
// 计算特定类别的产品数量
int accessoriesCount = products.Count(p => p.Category == "配件");
Console.WriteLine($"配件类产品数量: {
accessoriesCount}"); // 输出: 2
2.3 Min和Max - 获取最小值和最大值
Min和Max操作分别用于获取序列中的最小值和最大值。对于对象序列,可以通过选择器函数指定比较的属性。
// 获取数字序列的最大值和最小值
int min = numbers.Min();
int max = numbers.Max();
Console.WriteLine($"最小值: {
min}, 最大值: {
max}"); // 输出: 最小值: 1, 最大值: 10
// 获取产品中的最低价格和最高价格
decimal minPrice = products.Min(p => p.Price);
decimal maxPrice = products.Max(p => p.Price);
Console.WriteLine($"最低价格: {
minPrice}, 最高价格: {
maxPrice}"); // 输出: 最低价格: 499, 最高价格: 5999
// 获取最便宜的产品名称(多步骤操作示例)
string cheapestProductName = products
.OrderBy(p => p.Price)
.First()
.Name;
Console.WriteLine($"最便宜的产品: {
cheapestProductName}"); // 输出: 移动硬盘
2.4 Average - 计算平均值
Average操作用于计算数值序列的平均值,对于对象序列,可以指定用于计算平均值的属性。
// 计算数字序列的平均值
double average = numbers.Average();
Console.WriteLine($"数字序列平均值: {
average}"); // 输出: 5.5
// 计算产品的平均价格
decimal averagePrice = products.Average(p => p.Price);
Console.WriteLine($"产品平均价格: {
averagePrice}"); // 输出: 2899
// 计算特定类别产品的平均价格
decimal electronicAveragePrice = products
.Where(p => p.Category == "电子产品")
.Average(p => p.Price);
Console.WriteLine($"电子产品平均价格: {
electronicAveragePrice}"); // 输出: 约4332.33
2.5 Aggregate - 自定义聚合操作
Aggregate是一个更加灵活的聚合操作,它允许您定义自己的聚合逻辑。Aggregate接受一个累加器函数,该函数会对序列中的每个元素执行自定义操作。
// 使用Aggregate计算数字序列的总和(演示与Sum相同的功能)
int aggregateSum = numbers.Aggregate(0, (total, num) => total + num);
Console.WriteLine($"使用Aggregate计算总和: {
aggregateSum}"); // 输出: 55
// 使用Aggregate连接字符串
string jointNames = products.Aggregate("产品列表: ",
(result, product) => result + product.Name + "、",
result => result.TrimEnd('、') + "。");
Console.WriteLine(jointNames);
// 输出: 产品列表: 笔记本电脑、手机、耳机、移动硬盘、平板电脑。
// 使用Aggregate查找价格最高的产品
Product mostExpensive = products.Aggregate(
(highest, next) => next.Price > highest.Price ? next : highest);
Console.WriteLine($"最贵的产品: {
mostExpensive.Name}, 价格: {
mostExpensive.Price}");
// 输出: 最贵的产品: 笔记本电脑, 价格: 5999
3. 元素操作
元素操作是用于从序列中检索特定元素的操作,包括First、FirstOrDefault、Single、SingleO

最低0.47元/天 解锁文章
890

被折叠的 条评论
为什么被折叠?



