如何使用lambda表达式进行求和

3

我想要对一个组内所有零件的成本进行求和。

我的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>();

--调试模式下的属性

以下两张截图显示了每个部件的成本、所需总部件数量和总成本。但是总成本是不正确的。

我在哪里出错了?

Snap 1

Snap 2

Snap 3, 1 and 2 combined


如果是我,我不会使用三元操作符。不确定它是否与您的问题有关,但有太多括号等复杂情况。在我看来,三元操作符的用法应该尽量避免。 - ChiefTwoPencils
我不确定这是否重要,但似乎先进行了分组/选择,那里是求和的地方。然后再进行限制值的筛选。尝试先进行筛选,然后再进行分组/选择。 - ps2goat
这些数值看起来很合理,为什么它们是错误的?给我们提供数据以便诊断问题。现在你只能希望有人幸运地发现了问题(我没有——毕竟只是一个简单的求和调用!)。 - usr
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

好的,我明白你是如何使用组来完成的,那就是我之前迷失的地方。谢谢! - Filling The Stack is What I DO

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>();

只是一个提示 - 使用查询表达式并将重复的计算放入 let 中。此外,摆脱字符串解析。使用 (int)myDouble 代替。 - usr
1
from w in parts where Filter(w) group w by new { w.PartNumber, w.StockLength } let someIllegibleValue = int.Parse((Math.Ceiling(g.Sum(s => s.Length) / (g.Key.StockLength))).ToString()) select new { /* use g and someIllegibleValue here */} - usr
你能否修改答案代码并设置let值呢?或者使用我发布的答案代码,发布一个已经设置了let值的答案代码?具体来说,是设置一个总的let值。 - Filling The Stack is What I DO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接