【问题标题】:Calculate balance / running total from within an array从数组中计算余额/运行总计
【发布时间】:2021-02-01 10:57:21
【问题描述】:

我有一个包含项目的数组,其中一个条目是另一个包含行项目的数组

行项目有 Date QtyIn QtyOut

很难画出表格,但是像这样:

itemID ItemName Stock LineItems
Date, QtyIn, QtyOut
AppG1 Green Apple 100 2021-02-01, 100, 0
2021-02-02, 0, 60
2021-02-03, 0, 10
AppR1 Red Apple 85 2021-02-01, 500, 0
2021-02-02, 10, 0

我想为每个行项目生成一个流动余额,这是每个条目的 Stock +QtyIn -QtyOut

itemID ItemName Stock LineItems
Date, QtyIn, QtyOut, Balance
AppG1 Green Apple 100 2021-02-01, 100, 0, 200
2021-02-02 0 60, 140
2021-02-03 0 10, 130
AppR1 Red Apple 85 2021-02-01, 500, 0, 585
2021-02-02, 10, 0, 595

再一次,很难画出表格,但希望你明白我的意思

我的代码如下所示:

var lineItems = from li in lineitems
                select new LineItem
                {ItemID = li.ItemID,
                 QtyIn = li.QtyIn,
                 QtyOut = li.QtyOut,
                 DueDate = li.DueDate,
                }).OrderBy(o => o.ItemID).ThenBy(c => c.DueDate);

var result = from i in headeritems
             select new HeaderItem
             {ItemID = i.ItemID,
              ItemName= i.ItemName,
              Stock = i.ItemStock,
              LineItems = lineItems.Where(w => w.ItemID == i.ItemID)
             };

return result;

我希望我可以在 LineItem 类中添加一行来计算余额,但我不知道如何迭代这些 lineitems。然后我想我可以将它添加到将 lineitems 添加到结果数组的位置,但同样,我看不到如何执行此操作。有没有一种方法可以做到这一点,而不必使用循环遍历整个表?

【问题讨论】:

  • 试图理解:为什么预期结果的第2行和第3行都是200?他们不应该分别是 140 和 130 吗?
  • 你是对的,错字对不起。编辑问题

标签: c# asp.net entity-framework


【解决方案1】:

您可以使用在 lambda 中关闭的额外变量来汇总余额。

我们使用let balance,因为我们必须在每个HeaderItem 上重置,此外,我们必须使用ToList() 来确保计算实际上被正确重置。

var result = from i in headeritems
             let balance = i.Stock
             select new HeaderItem
             {ItemID = i.ItemID,
              ItemName= i.ItemName,
              Stock = i.ItemStock,
              LineItems = lineItems
                 .Where(w => w.ItemID == i.ItemID)
                 .Select(li => {
                      li.Balance = balance += li.QtyIn - li.QtyOut;
                      return li;
                 })
                 .ToList()
              };

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2016-07-18
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多