Linq 转换 parent 要按子列表实体分组的子列表列表
Linq transforming parent list of sub lists to be grouped by sub list entities
抱歉这个标题不清楚,但我不确定如何命名。只显示它会更容易:
Objects 示例:
class Order
{
public string OrderNumber{ get; set; }
public IEnumerable<ProductWithQuantity> ProductsWithQuantities{ get; set; }
}
class ProductWithQuantity
{
public string ProductName{ get; set; }
public int Quantity{ get; set; }
}
假设我有 IEnumerable<Order>
,每个订单都有产品清单和数量。订单始终具有相同的产品列表,只是数量不同。现在都是按订单分组,如何反转为按产品分组。
为了更好地形象化它,我将展示我想要在伪 jsons 上实现的目标。
当前json生成:
[
{
OrderNumber,
ProductsWithQuantities [
{ProductName, Quantity}
]
}
]
我想实现这样的目标:
[
{
ProductName,
OrdersWithQuantities [
{OrderNumber, Quantity}
]
}
]
我尝试使用 select 和分组依据,但我无法解决。
1 - 通过考虑以下测试集合:
List<Order> orders = new List<Order>
{
new Order
{
OrderNumber = "o1",
ProductsWithQuantities = new List<ProductWithQuantity>
{
new ProductWithQuantity{ProductName = "p1", Quantity=1},
new ProductWithQuantity{ProductName = "p2", Quantity=2},
}
},
new Order
{
OrderNumber = "o2",
ProductsWithQuantities = new List<ProductWithQuantity>
{
new ProductWithQuantity{ProductName = "p1", Quantity=1},
new ProductWithQuantity{ProductName = "p2", Quantity=2},
}
}
};
2 - 您可以使用 SelectManay
来展平所有产品。并通过构建新集合按 ProductName
分组,如以下代码:
var result = orders
.SelectMany(x => x.ProductsWithQuantities.Select(y => new { x.OrderNumber, y.ProductName, y.Quantity }))
.GroupBy(p => p.ProductName)
.Select(x => new
{
ProductName = x.Key,
OrderWithQuantities = x.Select(y => new { OrderNumer = y.OrderNumber, Quantity = y.Quantity }).ToList()
})
.ToList();
3 - 演示
foreach(var item in result)
{
Console.WriteLine($"{item.ProductName} : " +
$"{string.Join(",", item.OrderWithQuantities.Select(x => $"{x.OrderNumer}::{x.Quantity}"))}");
}
4 - 结果:
p1 : o1::1,o2::1
p2 : o1::2,o2::2
希望对您有所帮助。
抱歉这个标题不清楚,但我不确定如何命名。只显示它会更容易:
Objects 示例:
class Order
{
public string OrderNumber{ get; set; }
public IEnumerable<ProductWithQuantity> ProductsWithQuantities{ get; set; }
}
class ProductWithQuantity
{
public string ProductName{ get; set; }
public int Quantity{ get; set; }
}
假设我有 IEnumerable<Order>
,每个订单都有产品清单和数量。订单始终具有相同的产品列表,只是数量不同。现在都是按订单分组,如何反转为按产品分组。
为了更好地形象化它,我将展示我想要在伪 jsons 上实现的目标。
当前json生成:
[
{
OrderNumber,
ProductsWithQuantities [
{ProductName, Quantity}
]
}
]
我想实现这样的目标:
[
{
ProductName,
OrdersWithQuantities [
{OrderNumber, Quantity}
]
}
]
我尝试使用 select 和分组依据,但我无法解决。
1 - 通过考虑以下测试集合:
List<Order> orders = new List<Order>
{
new Order
{
OrderNumber = "o1",
ProductsWithQuantities = new List<ProductWithQuantity>
{
new ProductWithQuantity{ProductName = "p1", Quantity=1},
new ProductWithQuantity{ProductName = "p2", Quantity=2},
}
},
new Order
{
OrderNumber = "o2",
ProductsWithQuantities = new List<ProductWithQuantity>
{
new ProductWithQuantity{ProductName = "p1", Quantity=1},
new ProductWithQuantity{ProductName = "p2", Quantity=2},
}
}
};
2 - 您可以使用 SelectManay
来展平所有产品。并通过构建新集合按 ProductName
分组,如以下代码:
var result = orders
.SelectMany(x => x.ProductsWithQuantities.Select(y => new { x.OrderNumber, y.ProductName, y.Quantity }))
.GroupBy(p => p.ProductName)
.Select(x => new
{
ProductName = x.Key,
OrderWithQuantities = x.Select(y => new { OrderNumer = y.OrderNumber, Quantity = y.Quantity }).ToList()
})
.ToList();
3 - 演示
foreach(var item in result)
{
Console.WriteLine($"{item.ProductName} : " +
$"{string.Join(",", item.OrderWithQuantities.Select(x => $"{x.OrderNumer}::{x.Quantity}"))}");
}
4 - 结果:
p1 : o1::1,o2::1
p2 : o1::2,o2::2
希望对您有所帮助。