基于数量字段创建多个对象 - 是否有linq方式?

时间:2018-03-24 23:33:49

标签: c# linq

我有一个要求,我需要根据数量属性将对象分解为多个对象。

对于上下文,我们的ERP会将同一产品的行分组为单个记录,但数量为3。 我需要将它分解为每个单元的对象(在这种情况下为3个单位)。

我使用下面似乎运行良好,但我想知道是否有办法更优雅地做到这一点,例如通过LINQ?注意我使用的是Math.Abs,因为数量可能是负数。

for (int i = 1; i <= Math.Abs(distributionLine.OrderQuantity); i++)
{
  var detailLine = new TransactionDetail();
  detailLine.Skuidx = distributionLine.Skuidx;
  detailLine.OrderQuantity = distributionLine.OrderQuantity < 1 ? -1 : 1;

2 个答案:

答案 0 :(得分:0)

要回答您的问题,您可以使用像Eser建议的那样:

var result = Enumerable
             .Range(1, Math.Abs(distributionLine.OrderQuantity)) 
             .Select(x=> new TransactionDetail() {   
                        kuidx = distributionLine.Skuidx, 
                        OrderQuantity = distributionLine.OrderQuantity < 1 ? -1 : 1});

但是,你必须考虑这是否真的更优雅。如果您需要在此方法中设置其他属性和字段,该怎么办?如果另一个程序员(或者你的未来)读到这个怎么办?会发生什么事情以及为什么会这么明显吗?

如果不太清楚,Linq不一定更优雅。你原来的循环可能是最好的方法。

答案 1 :(得分:0)

var result = Enumerable
    .Range(1, Math.Abs(distributionLine.OrderQuantity)) 
    .Select(x => new TransactionDetail {   
        Skuidx = distributionLine.Skuidx, 
        OrderQuantity = 1 * Math.Sign(distributionLine.OrderQuantity)
    });

Note I also used Math.Sign which returns 1 or -1. It will return 0 if the argument is 0 but if we're in the Select lambda then Math.Abs(distributionLine.OrderQuantity) > 0. I also have 1 * ... because it clarifies that you want items with qty 1.

IMO this is pretty elegant, but maybe add a comment to solve the issues in vbnet3d's post!