2009-11-26 50 views
1

鉴于以下结构...获得的值的总和Linq中

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} 

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

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

请注意,这个列表背后没有数据库,我这样做纯粹与对象,因此提取原始列表包括总和不是一个选项。

谢谢。

+0

在运行时创建这些对象?或者在编译时如上所示? – 2009-11-26 11:55:06

回答

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) 
       }); 
+0

非常好,我刚刚根据Ruben的回答得出了这个结论,但是你的回答却把它交给了我。 – 2009-11-26 12:01:56

+0

没有必要单独拨打电话来选择此处。 GroupBy可以满足您的所有需求。 – 2009-11-26 12:03:32

+0

@Jon:是的,我意识到我发布之后,但是因为你首先得到了我的答案,而不是更新这个答案。 – LukeH 2009-11-26 12:05:50

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) 
      }); 
+0

确实链接wa非常相似和有用(+1)。我能够使用那里的内容来得到答案,然后根据下面的卢克的答案进行验证。 – 2009-11-26 12:02:44

+0

好东西。请记住,在上面和下面是一个非常短暂的概念! (顺便说一下,对于其他人...我的样本编辑发生在卢克和乔恩的回复[但独立:D]) – 2009-11-26 12:05:56

+0

点上/下面的点 - 必须尝试和记住! – 2009-11-26 12:19:21

10

您同时按类别和代码,希望组,所以你想一个匿名类型为 - 那么算了笔的数量。您可以在一个单一的呼叫这样对GroupBy如果使用right overload

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) }); 
+0

不错,不知道那个!谁会想到自己会从FGITWING一个小的LINQ问题中学到一些东西! – 2009-11-26 12:07:02

+0

Upvoted提供了纯粹的答案以及您提供两种语法的事实。谢谢。 – 2009-11-26 12:10:07