使用Linq进行GroupBy、Sum和Count操作

在C#开发中,LINQ(Language Integrated Query)是一种强大的查询语言,可以让我们轻松地处理集合数据。本文将详细介绍如何使用LINQ的GroupBy方法来对集合中的元素进行分组,并在此基础上计算每个分组的总和(Sum)和数量(Count)。这在实际开发中非常常见,特别是在需要统计分析的情况下。

假设我们有一个包含销售记录的列表,每条记录包括商品ID、销售数量以及销售额。我们的任务是对相同商品ID的记录进行分组,并计算每个商品的总销售额和总销售数量。以下是一个示例数据集:

using System;
using System.Collections.Generic;
using System.Linq;

public class SaleRecord
{
    public int ProductId { get; set; }
    public int Quantity { get; set; }
    public decimal Amount { get; set; }
}

public class Program
{
    public static void Main()
    {
        List<SaleRecord> sales = new List<SaleRecord>
        {
            new SaleRecord{ ProductId = 1, Quantity = 3, Amount = 90.0m },
            new SaleRecord{ ProductId = 2, Quantity = 1, Amount = 50.0m },
            new SaleRecord{ ProductId = 1, Quantity = 2, Amount = 60.0m },
            new SaleRecord{ ProductId = 3, Quantity = 4, Amount = 200.0m },
            new SaleRecord{ ProductId = 2, Quantity = 5, Amount = 250.0m }
        };
    }
}

首先,我们需要对sales列表中的记录按ProductId进行分组。这可以通过LINQ的GroupBy方法实现:

var groupedSales = sales.GroupBy(s => s.ProductId);

现在我们得到了一个包含不同产品ID分组的集合。接下来我们要计算每个产品的总销售额和销售数量。可以使用Select方法对每个分组进行进一步处理,并通过Sum方法计算总额,用Count方法获取记录数:

var result = groupedSales.Select(g => new 
{
    ProductId = g.Key,
    TotalAmount = g.Sum(s => s.Amount),
    TotalQuantity = g.Count()
}).ToList();

这里我们使用了一个匿名类型来存储每个分组的产品ID、总销售额和销售数量。最后,将结果转换为列表并输出:

foreach (var item in result)
{
    Console.WriteLine($"Product ID: {item.ProductId}, Total Amount: {item.TotalAmount:C}, Total Quantity: {item.TotalQuantity}");
}

运行这段代码后,你将会得到如下输出:

Product ID: 1, Total Amount: ¥150.00, Total Quantity: 2
Product ID: 2, Total Amount: ¥300.00, Total Quantity: 2
Product ID: 3, Total Amount: ¥200.00, Total Quantity: 1

从输出结果可以看出,我们成功地按产品ID对销售记录进行了分组,并计算了每个产品的总销售额和销售数量。LINQ的强大之处在于其简洁且高效的语法,使得我们能够快速而清晰地实现复杂的查询操作。

此外,LINQ还提供了许多其他有用的方法,例如Where用于过滤数据、OrderByThenBy用于排序等。熟练掌握这些方法可以帮助我们在日常开发中提高生产力,更高效地处理集合数据。

通过本文的学习,希望你能够对LINQ的GroupBySumCount方法有更深的理解,并能在实际项目中灵活运用。