获取Linq中的值的总和

时间:2009-11-26 11:52:46

标签: c# linq linq-to-objects

鉴于以下结构...

class Foo {

  public string Category { get; set; }
  public string Code { get; set; }
  public int Quantity { get; set; }

}

我正在尝试使用Linq按类别和代码汇总这些对象的列表,这样如果我提供以下来源......

List<Foo> foos = new List<Foo>() {
  new Foo {Category = @"A", Code = @"B", Quantity = 1},
  new Foo {Category = @"A", Code = @"B", Quantity = 2},
  new Foo {Category = @"C", Code = @"D", Quantity = 3},
  new Foo {Category = @"C", Code = @"D", Quantity = 4}
};

我最终得到一个包含...

的列表
  Foo {Category = @"A", Code = @"B", Quantity = 3},
  Foo {Category = @"C", Code = @"D", Quantity = 7}

(其中Quantity是匹配对象的原始数量的总和)。

我知道我需要使用group by子句和Sum()扩展方法的组合,我似乎无法找到正确的组合。

请注意,这个列表后面没有数据库,我只是用对象做这个,所以提取原始列表包括总和不是一个选项。

感谢。

3 个答案:

答案 0 :(得分:10)

您希望按类别和代码进行分组,因此您需要一个匿名类型 - 然后只需对数量求和。如果您使用right overload

,则只需拨打一次GroupBy即可完成此操作
var query = list.GroupBy(
    item => new { item.Category, item.Code },
    (key, group) => new Foo { Category = key.Category, 
                              Code = key.Code,
                              Quantity = group.Sum(x => x.Quantity) });

如果要使用查询表达式执行此操作,可以使用:

var query = from item in list
            group item by new { item.Category. item.Code } into items
            select new Foo { Category = items.Key.Category, 
                             Code = items.Key.Code,
                             Quantity = items.Sum(x => x.Quantity) });

答案 1 :(得分:3)

var query = foos
            .GroupBy(x => new { x.Category, x.Code })
            .Select(g => new Foo
                {
                    Category = g.Key.Category,
                    Code = g.Key.Code,
                    Quantity = g.Sum(x => x.Quantity)
                });

答案 2 :(得分:2)

LINQ Merging results in rows非常相似: -

        var result = foos
            .GroupBy( foo => new 
            { 
                foo.Category, 
                foo.Code 
            } )
            .Select( fooGroup => new Foo 
            { 
                Category = fooGroup.Key.Category, 
                Code = fooGroup.Key.Code, 
                Quantity = fooGroup.Sum( foo => foo.Quantity ) 
            } );