【问题标题】:In C# problem grouping by value and then summing在 C# 问题中按值分组然后求和
【发布时间】:2010-01-14 17:32:08
【问题描述】:

我正在尝试汇总按某个人的组织分组的一系列项目的成本。我相信总和工作正常,但我没有看到我的分组。存储在汇总中的对象只包含总和的值。除了该组织的成本总和之外,我希望他们拥有该组织。我在这个表达中遗漏了什么?

var rollup = OrgPersonList.GroupBy(
    person => person.Person.Org).Select(group =>
        group.Sum(price => price.Items.Sum(item =>
            item.Cost)));

【问题讨论】:

    标签: c# linq group-by sum


    【解决方案1】:

    嗯,你选择了总和 - 如果你也想要密钥,你应该选择它。例如:

    var rollup = OrgPersonList.GroupBy(x => x.Person.Org)
        .Select(group => new { group.Key,
                               Sum =group.Sum(x => x.Items.Sum(item => item.Cost))});
    

    请注意,我使用的是 x 而不是 personprice,因为似乎同一个项目封装了两者。

    或者作为查询表达式:

    var rollup = from x in OrgPersonList
                 group x by x.Person.Org into grouped
                 select new { grouped.Key,
                              Sum =grouped.Sum(x => x.Items.Sum(item =>item.Cost))});
    

    (用于格式化的空格有点紧...)

    另外,group...by 可以计算每个条目的总和,因此结果只需是组中条目的总和:

    var rollup = from x in OrgPersonList
                 group x.Items.Sum(item => item.Cost) by x.Person.Org into grouped
                 select new { grouped.Key, Sum = grouped.Sum() }); 
    

    【讨论】:

    • 单字母变量名是 style 选择还是 linq / lambda 表达式的教学机制?
    • @ahsteele:我不知道 OrgPersonList 中的项目到底是什么,所以很难想出一个更好的名字。诚然,单字母名称在 LINQ 查询中非常方便如果它们很容易理解。在这种情况下,它更多是出于必要性 - 我希望在使用同一类型时保持一致(而不是使用 personprice 用于同一类型的对象)。
    • @Jon 这些选项之间是否存在性能差异或者是偏好问题?
    • @ahsteele:老实说,我不想猜测。它将部分取决于上下文 - 这是 LINQ to Objects、LINQ to SQL、Entity Framework 还是其他?如果性能对您很重要,请进行测试。
    • 我建议编译所有三个版本并检查它们是如何在 Reflector 中编译的。前两个将是相同的;后者将使用 GroupBy 和 Sum 的不同重载。性能差异可以忽略不计,但后者增加的开销略少,因为它将 Sum 投影移动到 GroupBy 调用中,替换了恒等投影。也就是说,如果您在该级别进行优化,您可能不应该使用 LINQ。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    相关资源
    最近更新 更多