📜  groupby 嵌套 linq (1)

📅  最后修改于: 2023-12-03 15:31:04.725000             🧑  作者: Mango

使用 GroupBy 嵌套 Linq

在Linq中,我们可以使用GroupBy()操作符按照给定的键来分组数据。但有时我们需要在分组之后再次对数据进行分组,这时就需要使用嵌套的GroupBy()。本文将介绍如何使用嵌套的GroupBy()

示例数据

我们使用如下的订单数据来演示嵌套GroupBy()

var orders = new List<Order>
{
    new Order { Id=1, CustomerId=1, Product="Product1", Price=10, Quantity=2 },
    new Order { Id=2, CustomerId=1, Product="Product2", Price=20, Quantity=1 },
    new Order { Id=3, CustomerId=2, Product="Product3", Price=30, Quantity=3 },
    new Order { Id=4, CustomerId=2, Product="Product1", Price=10, Quantity=1 },
    new Order { Id=5, CustomerId=3, Product="Product2", Price=20, Quantity=2 },
    new Order { Id=6, CustomerId=3, Product="Product1", Price=10, Quantity=4 },
    new Order { Id=7, CustomerId=3, Product="Product3", Price=30, Quantity=1 },
    new Order { Id=8, CustomerId=4, Product="Product4", Price=40, Quantity=2 }
};

其中,Order类定义如下:

class Order
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public string Product { get; set; }
    public decimal Price { get; set; }
    public int Quantity { get; set; }
}
基础用法

我们首先使用GroupBy()按照顾客名称分组:

var groupedOrders = orders.GroupBy(o => o.CustomerId);

这将返回一个IGrouping<int, Order>类型的实例,其中键是顾客Id,值是一个分组后的订单列表。

我们可以使用foreach循环遍历这个列表,并输出每个分组的顾客Id和订单数:

foreach (var group in groupedOrders)
{
    Console.WriteLine($"CustomerId={group.Key}, OrderCount={group.Count()}");
}

输出结果如下:

CustomerId=1, OrderCount=2
CustomerId=2, OrderCount=2
CustomerId=3, OrderCount=3
CustomerId=4, OrderCount=1
嵌套使用

如果我们需要在顾客分组的基础上再按照产品分组,可以将第一次分组的结果再次使用GroupBy()

var nestedGroupedOrders = orders
    .GroupBy(o => o.CustomerId)
    .Select(g => new {
        CustomerId = g.Key,
        OrdersByProduct = g.GroupBy(o => o.Product)
    });

这个语句将返回一个包含两个属性的匿名类型。CustomerId是顾客Id,OrdersByProduct是按照产品名称分组的订单列表。

我们可以使用嵌套的foreach循环遍历这个列表,并输出每个顾客的产品订单数:

foreach (var customer in nestedGroupedOrders)
{
    Console.WriteLine($"CustomerId={customer.CustomerId}");

    foreach (var group in customer.OrdersByProduct)
    {
        Console.WriteLine($"\tProduct={group.Key}, OrderCount={group.Count()}");
    }
}

输出结果如下:

CustomerId=1
    Product=Product1, OrderCount=1
    Product=Product2, OrderCount=1
CustomerId=2
    Product=Product3, OrderCount=1
    Product=Product1, OrderCount=1
CustomerId=3
    Product=Product2, OrderCount=1
    Product=Product1, OrderCount=1
    Product=Product3, OrderCount=1
CustomerId=4
    Product=Product4, OrderCount=1
总结

使用嵌套的GroupBy()可以方便地对数据进行多层分组并统计结果。与Linq的其他操作符结合使用,可以实现更为复杂的数据处理需求。