如何将两个平面列表组合成一个嵌套对象

我有三个列表,每个列表中包含三个相同的属性。我想将结果合并为一个集合。防爆班的结构如下

public class Order
{
    public int ProductId { get; set; }
    public int CustomerId { get; set; }
    public int OrderId { get; set; }

    // Few other Properties of OrderDetail
}
public class PaymentDetail
{
    public int ProductId { get; set; }
    public int CustomerId { get; set; }
    public int OrderId { get; set; }
    // Few other Properties form PaymentDetail
}

public class CouponUsageDetail
{
    public int ProductId { get; set; }
    public int CustomerId { get; set; }
    public int OrderId { get; set; }
    // Few other Properties form CouponUsageDetail
}

这种类型的输出来自一个API服务,其中每个类都采用列表对象(JSON格式)的形式,我们需要对此执行一些操作。所有三个属性(ProductId,CustomerId,OrderId)在每个集合中包含相同的值,这意味着在每个集合中重复所有三个属性。我们需要对这些集合进行一些查找。因此,通常情况下,我们可以这样处理-从“订单”列表开始foreach并过滤PaymentDetail和CouponUsageDetail的所有三个匹配属性。但是,当数据大小增加时,在性能方面会更昂贵。因此,考虑将嵌套结构预先放置并避免查找。如果我们将输出嵌套如下,将有助于避免在PaymentDetail和CouponUsageDetail上查找。例-我们收到以下格式的JOSN

{"Orders":[{"ProductId":301,"CustomerId":101,"OrderId":201},{"ProductId":701,"CustomerId":501,"OrderId":601}],"PaymentDetails":[{"ProductId":301,"CustomerId":101,"OrderId":201},{"ProductId":701,"CustomerId":501,"OrderId":601}],"CouponUsageDetails":[{"ProductId":301,"CustomerId":101,"OrderId":201},{"ProductId":701,"CustomerId":501,"OrderId":601}]}

并通过此输出,我们希望将对象形成为

public class OrderDetails
{
    public int ProductId { get; set; }
    public int CustomerId { get; set; }
    public int OrderId { get; set; }
    // Few other Properties of OrderDetail

    List<PaymentDetail> PaymentDetail { get; set; }
    List<CouponUsageDetail> CouponUsageDetail { get; set; }
}

您能指导linq的最佳最佳用法是什么,在这里我们可以将所有这三个匹配的属性组合在一起,并使它成为更好的嵌套结构?谢谢!注意:我知道此结构需要规范化,但是请忽略规范化规则,因为这不在我们的控制范围内。

伊万·斯托夫

您所描述的声音就像是两个标准的多键LINQ组联接一样它们非常有效(LINQ to Objects实现使用准备好的基于快速哈希的查找),因此不需要进一步的优化:

var orderDetails = (
    from o in data.Orders
    join p in data.PaymentDetails
        on new { o.ProductId, o.CustomerId, o.OrderId }
        equals new { p.ProductId, p.CustomerId, p.OrderId }
        into orderPaymentDetails
    join c in data.CouponUsageDetails
        on new { o.ProductId, o.CustomerId, o.OrderId }
        equals new { c.ProductId, c.CustomerId, c.OrderId }
        into orderCouponUsageDetails
    select new OrderDetails
    {
        ProductId = o.ProductId,
        CustomerId = o.CustomerId,
        OrderId = o.OrderId,
        // Few other Properties of OrderDetail
        PaymentDetail = orderPaymentDetails.ToList(),
        CouponUsageDetail = orderCouponUsageDetails.ToList(),
    })
    .ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将两个动作组合成一个对象

Python:如何将两个平面列表组合成2D数组?

Python-将两个列表组合成一个json对象

Python 2.7.12:如何将两个列表组合成一个字典

如何将两个查询集组合成一个类似字典的对象?

如何将两个地图组合成一个json数据

如何将这两个命令组合成一个命令?

如何将Julia中的两个Vector组合成一个Dict?

如何将两个一维列表组合成二维数组?

如何用键将两个数组组合成一个对象

将两个列表组合成一个句子(python)

将两个json部分组合成一个json对象

如何将两个大字符向量组合成一个数据帧?

如何将两个不同长度的数组组合成一个关联的多维数组?

如何将两个逻辑相同的方法组合成一个泛型方法

如何将两个列表按顺序组合成字典?

如何将两个数组列表组合成一个数组列表并将其传递给过程

如何将两个数组组合成一个2D数组?

在python中组合成一个平面列表

如何将多个命令组合成一个嵌套循环?

如何将这两个函数组合成一个带有两个参数的函数?

如何将javascript变量组合成一个对象

如何将日期和时间组合成一个 Date 对象?

如何将两个数据框组合成一个图表,每个类我将有两个并排堆叠的条形图?

ES6 将两个变量组合成一个现有的 javaScript 对象

如何将两个 UUIDv4 字符串组合成一个唯一的 UUIDv4 字符串

如何将2个列表组合成成对的嵌套列表?

Python将两个变量语句组合成一个numpy函数

将两个 if 条件组合成一个 if 条件