【问题标题】:C# Sum Object List on specific property特定属性上的 C# Sum 对象列表
【发布时间】:2020-09-08 06:23:13
【问题描述】:

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

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

我想改造这个列表,目标列表应该是这样的:

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

我希望将所有名称为“A”的对象“合并”成一个对象,其中 val 现在是单个对象的所有值的总和。目前我正在使用一个 foror 循环和一个新的列表,我每次都循环来实现这一点,但我认为这是非常低效的。可能有一些 LINQ 选项可以做到这一点,但我没有找到任何东西。我该如何优化它?

提前致谢!

【问题讨论】:

  • 这是 json ,你正在使用它吗?还是这些 C# 类您使用了错误的语法?
  • 如果是后者,List.GroupBy(x => x.name ).Select( x => new { name = x.Key, val = x.Sum()});
  • 哦,是的,我用 JSON 写下来了,但它们确实是代码中的对象
  • 这能回答你的问题吗? Linq: GroupBy, Sum and Count

标签: c# asp.net asp.net-mvc linq


【解决方案1】:

您可以简单地使用GroupBy 并投影结果

对序列的元素进行分组。

示例

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

【讨论】:

    【解决方案2】:

    您可以使用.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

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 有趣的方法,但遗憾的是,对于我目前的项目结构,这不是一个好主意,不过还是感谢您的回答!
      猜你喜欢
      • 2013-06-24
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2012-07-19
      • 1970-01-01
      • 2016-04-03
      相关资源
      最近更新 更多