按 2 个属性聚合列表项并在 C# 中对第 3 个进行求和
Aggregating list items by 2 properties and summing the 3rd in C#
我有一个包含三个属性的对象列表 LoggedRestarts
:Release
、Build
和 NumberOfRestarts
。前两个包含许多重复项,第三个 属性 可能具有不同的值。我想将它们合二为一并对 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 但我无法解决这个问题。
因此,我怎样才能完成上述操作?
您可以使用 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,您还可以初始化 class.
的新实例
我有一个包含三个属性的对象列表 LoggedRestarts
:Release
、Build
和 NumberOfRestarts
。前两个包含许多重复项,第三个 属性 可能具有不同的值。我想将它们合二为一并对 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 但我无法解决这个问题。
因此,我怎样才能完成上述操作?
您可以使用 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,您还可以初始化 class.
的新实例