我有一个要求,我需要根据数量属性将对象分解为多个对象。
对于上下文,我们的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;
答案 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!