📅  最后修改于: 2023-12-03 15:31:04.725000             🧑  作者: Mango
在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的其他操作符结合使用,可以实现更为复杂的数据处理需求。