2

我试图总结一个组中所有部分的成本。

我的 Total、TotalLength、Loss 和 CutPart 按预期工作。

当我对组中所有部分的成本求和时,我没有得到预期的结果。

一切都完美计算,但不是总和/成本

--这里是我分组的地方

 List<PartsProcessor.IPart> parts = Task.Run(async () => await this.ProcessedParts.CombineParts(false)).Result;

//Stocks
this.StockLengths = parts.GroupBy(o => new { o.PartNumber, o.StockLength }).Select(g => new PartsProcessor.GroupedPart
{
    Total = (g.Key.StockLength > 0 ? int.Parse((Math.Ceiling(g.Sum(s => s.Length) / (g.Key.StockLength))).ToString()) : 1),
    TotalLength = g.Sum(s => s.Length),
    Loss = g.Key.StockLength > 0 ? (g.Key.StockLength * (Math.Ceiling(g.Sum(s => s.Length) / (g.Key.StockLength)))) - (g.Sum(s => s.Length)) : 0,
    **Cost = g.Sum(s => s.Cost),**
    CutPart = g.FirstOrDefault()
}
                                     )
.Where(w => w.CutPart.Category.ToLower() != "glass" &&
            w.CutPart.Category.ToLower() != "glazing" &&
           !w.CutPart.Category.ToLower().Contains("epdm") &&
           !w.CutPart.Category.ToLower().Contains("end dam") &&
            w.CutPart.Category.ToLower() != "leaf" &&
            w.CutPart.Category.ToLower() != "door frame").ToList<PartsProcessor.IGroupedPart>();

--调试模式下的属性

在下面的两个快照中,它显示了每个的成本、所需的总零件和总成本。但总成本不正确。

我在哪里错了?

快照 1

快照 2

Snap 3、1 和 2 组合

4

2 回答 2

4

从评论中响应您的请求,我提供以下代码段:

from w in parts
where Filter(w)
group w by new { w.PartNumber, w.StockLength } into g
let someValue = int.Parse((Math.Ceiling(g.Sum(s => s.Length)/(g.Key.StockLength))).ToString())
select new
{
    Total = g.Key.StockLength > 0 ? someValue : 1,
    TotalLength = g.Sum(s => s.Length),
    Loss = g.Key.StockLength > 0 ? someValue - (g.Sum(s => s.Length)) : 0,
    Cost = (g.Key.StockLength > 0 ? someValue : 1)*g.Average(s => s.Cost),
    CutPart = g.FirstOrDefault(),
};

您可以someValue根据需要多次重复使用。

于 2013-10-03T15:09:30.933 回答
2

我让它与下面的代码一起工作。移动 where 和 groupby 没有帮助。由于平均值总是相同的,因此我能够编写如下所示的代码。

 this.StockLengths = parts
                     .Where(w => w.Category.ToLower() != "glass" &&
                            w.Category.ToLower() != "glazing" &&
                           !w.Category.ToLower().Contains("epdm") &&
                           !w.Category.ToLower().Contains("end dam") &&
                            w.Category.ToLower() != "leaf" &&
                            w.Category.ToLower() != "door frame")

                    .GroupBy(o => new { o.PartNumber, o.StockLength }).Select(g => new PartsProcessor.GroupedPart
                {
                    Total = (g.Key.StockLength > 0 ? int.Parse((Math.Ceiling(g.Sum(s => s.Length) / (g.Key.StockLength))).ToString()) : 1),
                    TotalLength = g.Sum(s => s.Length),
                    Loss = g.Key.StockLength > 0 ? (g.Key.StockLength * (Math.Ceiling(g.Sum(s => s.Length) / (g.Key.StockLength)))) - (g.Sum(s => s.Length)) : 0,
                    Cost = (g.Key.StockLength > 0 ? int.Parse((Math.Ceiling(g.Sum(s => s.Length) / (g.Key.StockLength))).ToString()) : 1) * g.Average(s => s.Cost),
                    CutPart = g.FirstOrDefault()
                }
                  ).ToList<PartsProcessor.IGroupedPart>();
于 2013-10-02T21:38:50.413 回答