首页 > 解决方案 > 在添加总计时使用 Linq 对重复项进行分组

问题描述

我有这个应用程序,我正在尝试添加功能。该函数返回一个列表。

编辑: 功能是整理整个公司每个年级组的所有成本。然而,结果显示了每个公司等级组的成本。这意味着有重复的 GradeGroupCodes,因为这些等级组属于不同的子公司。我想把所有这些结果汇总起来,然后将所有子公司的总数汇总在一个年级组内。

即镁 1,000
镁 500
镁 1,500

我要
镁 3,000

我正在尝试使用 Linq 查询将重复的“GradeGroupCodes”总数加在一起。

return summaryResults.GroupBy(name => name.GradeGroupCode).Select(item => item.First()).ToList();

.Select(.First())试图让它返回一个列表而不是一个 IGrouping<>。

我知道它不起作用,因为它只是返回具有重复 GradeGroupCode 的第一个项目,但是我一直在摆弄这个超过 3 个小时,似乎无法弄清楚如何让 Duplicate GradeGroupCodes 折叠成彼此相加总和。

我想在 LINQ 中执行此操作,但如果不可能,我想我可以尝试不同的方式。

为清楚起见添加

摘要结果只是这个对象的列表

var summaryLine = new AvgCostSummary
{
   GradeGroupCode = avgCostQuery.GradeGroupCode.Trim(),
   Grade = firstOrDefault.Grade.Trim(),
   QtyRecNt = firstOrDefault.QtyRecNt,
   AvgCostDl = firstOrDefault.AvgCostDl,
   AvgPricePerLb = firstOrDefault.AvgPricePerLb,
   TotalCost = firstOrDefault.TotalCost,
   Discount = firstOrDefault.Discount,
   ConsNum = avgCostQuery.ConsNum,
   PeriodBegin = avgCostQuery.PeriodBegin,
   PeriodEnd = avgCostQuery.PeriodEnd
};

在这种特殊情况下,ConsNum 是没有考虑的,它不会被显示。

感谢您的任何帮助!

标签: c#linq

解决方案


我建议下面的 LINQ 查询(代码中的注释)。

summaryResults
    .GroupBy(name => name.GradeGroupCode)
    .Select(group =>
    {
        var firstItem = group.First();
        return new AvgCostSummary()
        {
            // For all properties I use data from first result,
            // as you did not specify otherwise, except TotalCost
            // which I assume we ned to sum.
            GradeGroupCode = firstItem.GradeGroupCode.Trim(),
            Grade = firstItem.Grade.Trim(),
            QtyRecNt = firstItem.QtyRecNt,
            AvgCostDl = firstItem.AvgCostDl,
            AvgPricePerLb = firstItem.AvgPricePerLb,
            
            // Here we use whole group to sum TotalCost
            TotalCost = group.Sum(item => item.TotalCost), 
            
            Discount = firstItem.Discount,
            ConsNum = firstItem.ConsNum,
            PeriodBegin = firstItem.PeriodBegin,
            PeriodEnd = firstItem.PeriodEnd
        }
    });

注意:它会使您的数据变平,并且代替每个唯一的组代码,将只有一个带有总计的对象。


推荐阅读