特定属性上的C#总和对象列表

问题描述

我目前正在开发一个ASP.NET应用程序,在该应用程序中,我需要根据从数据库接收到的数据来显示几个图表。我以对象列表的形式接收它们,例如:

{ 
    { name: "A",val: 20 },{ name: "A",val: 10 },{ name: "B",val: 6 },{ name: "C",val: 1 },val: 20 } 
}

我要转换此列表,目标列表应如下所示:

{ { name: "A",val: 30 } { name: "B",val: 21 } }

我希望将所有名称为“ A”的对象“合并”为一个对象,其中val现在是单个对象的所有值的总和。目前,我使用的是foor循环和新的List,我花了很长时间反复浏览以实现此目的,但是我认为这效率很低。可能有一些LINQ选项可以做到这一点,但我还没有发现任何东西。我该如何优化呢?

谢谢!

解决方法

您只需使用GroupBy并投影结果

对序列的元素进行分组。

示例

var results = List.GroupBy(x => x.name)
                  .Select( x => new { name = x.Key,val = x.Sum(x => x.val) });
,

您可以使用.GroupBy()根据Name属性对对象列表进行分组,然后使用.Sum()计算Val属性的所有值的总和。

var groupResult = ListOfObject
    .GroupBy(x => x.Name)
    .Select(y => new
            {
                Name= y.Key,Val = y.Sum(s => s.Val)
            });

.Net Fiddle

,

您也可以在数据库端对其求和 https://www.w3resource.com/sql/aggregate-functions/sum-with-group-by.php