深入掌握LINQ高级查询操作技巧

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰茶_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值