首页 > 解决方案 > 按 2 个属性聚合列表项并在 C# 中对第 3 个求和

问题描述

我有一个LoggedRestarts具有三个属性的对象列表ReleaseBuildNumberOfRestarts。前两个包含许多重复项,第三个属性可能具有不同的值。我想将这些汇总为一个并求和NumberOfRestarts;与我在 python 中编写的内容相当:df = df.groupby(['Release','Build'], as_index=False)['NumberOfRestarts'].sum().

假设我的LoggedRestarts列表中有这些类型的对象:

    Release-----------------Build---------------NumberOfRestarts
(1) 12.21------------------Build1---------------1
(2) 12.21------------------Build1---------------2

我希望它变成这样:

    Release-----------------Build---------------NumberOfRestarts
(1) 12.21------------------Build1---------------3

目前我有以下代码,它并没有真正使用,因为仍有未聚合的值。

for (int i = 0; i < loggedRestartsList.Count; i++)
     {
        if (loggedRestartsList[i].release == loggedRestartsList[i + 1].release
            & loggedRestartsList[i].build == loggedRestartsList[i + 1].build)
        {
           loggedRestartsList[i+1].numberOfRestarts = loggedRestartsList[i].numberOfRestarts + loggedRestartsList[i + 1].numberOfRestarts;
           loggedRestartsList.RemoveAt(i);
        }
     }

我还找到了这样的解决方案:Linq: GroupBy, Sum and Count但我无法解决这个问题。

因此,我怎样才能完成上述工作?

标签: c#listconsole-application

解决方案


您可以使用 LINQ GroupBy

List<(string Release, string Build, int NumberOfRestarts)> releaseBuildGroups = loggedRestartsList
    .GroupBy(x => (x.Release, x.Build))
    .Select(g => (g.Key.Release, g.Key.Build, g.Sum(x => x.NumberOfRestarts)))
    .ToList();

除了使用 ValueTuple 之外,您还可以初始化类的新实例。


推荐阅读