在添加总数时使用Linq分组重复项目

  • 本文关键字:项目 Linq 添加 c# linq
  • 更新时间 :
  • 英文 :


我有这个应用程序,我试图添加功能。这个函数返回一个List。

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

即镁1000
镁500
镁1500

我要
镁3000

我正在尝试使用Linq查询将重复的"GradeGroupCodes"成一个。

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

我使用.Select(.First())试图让它返回一个List而不是igrouing <>

我理解它不工作,因为它只是返回有一个重复的GradeGroupCode的第一个项目,但是我已经摆弄这个超过3个小时,似乎无法弄清楚如何让重复的GradeGroupCode在合计它们的总数时相互坍塌。

我想在LINQ中这样做,但如果不可能,我想我可以尝试不同的方式。

为清晰添加

Summary results就是这个对象的s list

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,它将不显示。

感谢所有的帮助!

我建议如下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
}
});

注意:它会使你的数据变平,在每个唯一的组代码的地方,只会有一个对象的总和。

感谢@ michael Turczyn指引我走上正确的道路。

除了提供的属性之外,我还需要使用其他属性,但这并没有改变解决方案。

把我最初尝试的解决方案和michael的方案结合起来就是票。

// Group the results
var groupedResult = summaryResults.GroupBy(name => name.GradeGroupCode);
// Calculate the correct totals for the groups and assign them to the first item in the group
foreach (var group in groupedResult)
{
group.First().QtyOrderedSummary     = group.Sum(QtyOrderedSummary => QtyOrderedSummary.QtyOrderedSummary);
group.First().QtyShippedSummary     = group.Sum(QtyShippedSummary => QtyShippedSummary.QtyShippedSummary);
group.First().QtyReceivedSummary    = group.Sum(QtyReceivedSummary => QtyReceivedSummary.QtyReceivedSummary);
group.First().QtyDueSummary         = group.Sum(QtyDueSummary => QtyDueSummary.QtyDueSummary);
group.First().CostSummary           = group.Average(CostSummary => CostSummary.CostSummary);
group.First().TotalCostSummary      = group.Sum(TotalCostSummary => TotalCostSummary.TotalCostSummary);
}
// Return the first items of the group to a list
return groupedResult.Select(item => item.First()).ToList();

最新更新