如何使用lambda表达式求和

时间:2013-10-02 21:09:20

标签: c# .net linq lambda

我正在尝试总结一组中所有部分的成本。

我的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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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>();